Python入门笔记—第四章(列表List)

第四章:列表(List)

- 定义:一组有顺序的集合(重点:有顺序)

1 创建列表的方法(4种)

#创建空列表
l1 = []
print(type(l1))
print(l1)

#创建单值列表
l2 = [1001]
print(type(l2))
print(l2)

#创建多值列表
l3 = [1,2,3,4,5,6]
print(type(l3))
print(l3)

#使用list
l4 = list()
print(type(l4))
print(l4)

2 列表常用操作

  • 列表的下标都是从0开始(基本上所有的语言下标都是从0开始)

注意:左闭右开

2.1 创建列表

l = [1,3,5,7,8,0]

print(l[3])

#结果:7

print(l[1:4])

#结果:[3,5,7]   注:Python中一般情况下都是左闭右开

print(l[2:10])

#结果:[5,7,8,0]   注:超过区间范围的忽略不计

print(l[1:]) 

#结果:[3,5,7,8,0]

print(l[:4]) 

#结果:[1,3,5,7]

2.2 列表删除

l = [1,2,3,4,5,6]
del l[3]
print(l)

del l
print(l)

结果:[1,2,3,5,6]

然后报错

注:

  • 删除列表中的某个成员只是原地删除,并不是生成一个新的列表,因此其地址不会改变
  • 删除了某个变量之后,不能再使用该变量,否则会报错</u>**

2.3 列表加法

  • 两个列表相加,即将两个列表合成一个
a = [1,2,3,4,5]
b = [5,6,7,8,9]
c = a + b
print(c)

结果:[1,2,3,4,5,5,6,7,8,9]

2.4 列表乘法

  • 列表乘n,即将列表重复n遍
a = [1,2,3]
b = a * 3
print(a)

结果:[1,2,3,1,2,3,1,2,3]

2.5 列表遍历

  • for,while,一般情况下不使用while遍历列表

  • 使用for遍历

a = [1,2,3,4,5]
for i in a:
    print(i)

b = ["aaa","bbb","ccc"]
for i in b:
    print(i)

结果:

1
2
3
4
5
aaa
bbb
ccc
  • 使用while遍历
a = [1,2,3,4,5]
b = len(a)
index = 0
while index < b:
    print(a[index])
    index += 1

可以看出,使用while遍历列表比较麻烦,代码冗长,因此一般情况下不使用while遍历列表

  • 双层列表遍历
a = [["damao",11],["cccd",22],["adss",33]]
for k,v in a:
    print(k,"-->",v)

a = [["damao",11,"ddsa"],["cccd",22,"qwe"],["adss",33,"dfffa"]]
for k,v,z in a :
    print(k,"-->",v,"-->",z)
结果:
damao --> 11
cccd --> 22
adss --> 33
damao --> 11 --> ddsa
cccd --> 22 --> qwe
adss --> 33 --> dfffa

2.6 列表内涵

  • 通过简单的方法创作list

  • 下列代码的含义:将a中的元素逐个放入b中

a = [1,2,3,4,5]
b = [i for i in a]
print(b)

a = [1,2,3,4,5]
b = [i*10 for i in a]
print(b)

结果:[1, 2, 3, 4, 5]

       [10, 20, 30, 40, 50]
  • 可以加入条件语句,如要求为偶数,为100的倍数等
a = range(1,50)
b = [i for i in a if i % 2 ==0]
print(b)

c = range(100,1000)
d = [i for i in c if i % 100 ==0]
print(d)
  • 可以使用for循环嵌套
a = [i for i in range(1,5)]
b = [i for i in range(100,500) if i % 100 == 0]
c = [m+n for m in a for n in b]
print(c)
c = [m+n for m in a for n in b if m+n < 350]
print(c)

结果:

[101, 201, 301, 401, 102, 202, 302, 402, 103, 203, 303, 403, 104, 204, 304, 404]

[101, 201, 301, 401, 102, 202, 302, 402, 103, 203, 303, 403, 104, 204, 304, 404]
[101, 201, 301, 102, 202, 302, 103, 203, 303, 104, 204, 304]

2.7 列表常用函数

2.7.1 list—将其他格式的数据转换成list

s = "I love wangxiaojing"
print(list(s))

结果:

['I', ' ', 'l', 'o', 'v', 'e', ' ', 'w', 'a', 'n', 'g', 'x', 'i', 'a', 'o', 'j', 'i', 'n', 'g']

  • 空格也是字符

2.7.2 length,max,min

l = [1,2,3,4,555]
print(len(l),max(l),min(l))

结果:

5 555 1

2.7.2 追加以及插入—append,insert

  • 追加—append,即为在列表末尾追加一个值,<u>原地操作</u>

  • 插入—insert(index,data),即为在index之前插入data,<u>原地操作</u>

l = [i for i in range(1,6)]
print(id(l))
l.append(888)
print(l,id(l))
l.insert(4,666)
print(l,id(l))

结果:

139678380997960
[1, 2, 3, 4, 5, 888] 139678380997960
[1, 2, 3, 4, 666, 5, 888] 139678380997960

2.7.3 pop、remove

  • pop,将队尾某个值拿出来赋值给某个值,并在当前队列删除这个值(一般使用该函数时,经常会看到赋值操作)

  • 删除列表中某个特定的值 remove,<u>该操作是原地删除</u>

a = [i for i in range(1,8)]
print(id(a))

last_word = a.pop()
print(last_word)
print(a,id(a))

a.insert(5,666)
print(a,id(a))

a.remove(666)
print(a,id(a))

结果:

139678380968648
7
[1, 2, 3, 4, 5, 6] 139678380968648
[1, 2, 3, 4, 5, 666, 6] 139678380968648
[1, 2, 3, 4, 5, 6] 139678380968648

2.7.4 reverse、clear

  • reverse,翻转列表,<u>原地操作</u>

  • clear,清空列表,<u>原地操作</u>

a = [i for i in range(1,8)]
print(a,id(a))

a.reverse()
print(a,id(a))

a.clear()
print(a,id(a))

结果:

[1, 2, 3, 4, 5, 6, 7] 139678380995528
[7, 6, 5, 4, 3, 2, 1] 139678380995528
[] 139678380995528

2.7.5 extend、count

  • extend,,在某个列表后面扩展一个列表,其操作和列表的加法类似,不同点在于extend操作是<u>原地操作,</u>而列表相加会另外开辟一块存储 空间来存放新变量的值和地址

  • count,统计列表中某个值的个数

a = [i for i in range(1,8)]
b = [i for i in range(6,12)]
print(a,id(a))

print(a + b,id(a+b))

a.extend(b)
print(a,id(a))

print(a.count(6))

结果:

[1, 2, 3, 4, 5, 6, 7] 139678399181704
[1, 2, 3, 4, 5, 6, 7, 6, 7, 8, 9, 10, 11] 139678381585224
[1, 2, 3, 4, 5, 6, 7, 6, 7, 8, 9, 10, 11] 139678399181704
2

2.7.6 copy

  • 此处copy函数为浅拷贝,即只拷贝一层内容

  • <u>深拷贝暂时不讲?</u>

#列表赋值操作
a = [i for i in range(1,8)]
print(a,id(a))
b = a
print(b,id(b))
b[4] = 777
print(b,id(b))
print(a,id(a))

结果:

[1, 2, 3, 4, 5, 6, 7] 139678380996680
[1, 2, 3, 4, 777, 6, 7] 139678380996680
[1, 2, 3, 4, 777, 6, 7] 139678380996680

*<u>- 在此处将列表a赋值给b后,输入传址操作,在改变b列表中某个变量的值后,列表a中的值也相应改变,然后并不是我想看到的结果,我 只是单纯的想改变列表b中某个变量的值

  • 因此,需要采用copy函数</u>*
a = [i for i in range(1,8)]
print(a,id(a))
b = a.copy()
print(b,id(b))

b[6] = 888
print(a,id(a))
print(b,id(b))

结果:

[1, 2, 3, 4, 5, 6, 7] 139678381486152
[1, 2, 3, 4, 5, 6, 7] 139678380996680
[1, 2, 3, 4, 5, 6, 7] 139678381486152
[1, 2, 3, 4, 5, 6, 888] 139678380996680

附:深拷贝皮毛

a = [1,2,3,[10,20,30]]
b = a.copy()

print(a,id(a))
print(b,id(b))

print(a,id(a[3][2]))
print(b,id(b[3][2]))

a[3][2] = 222
print(a)
print(b)

结果:

[1, 2, 3, [10, 20, 30]] 139678381047752
[1, 2, 3, [10, 20, 30]] 139678380825608
[1, 2, 3, [10, 20, 30]] 94184610553984
[1, 2, 3, [10, 20, 30]] 94184610553984
[1, 2, 3, [10, 20, 222]]
[1, 2, 3, [10, 20, 222]]

<u>- 出现以上结果(a[3][2]和b[3][2]的地址一样)的原因是由于copy是浅拷贝,即值拷贝一层内容,如果需要解决此问题需要用到深拷贝, 而深拷贝需要特定的工具,此处暂时不讲(因为老师不会,哈哈哈)</u>

3 列表的分片操作

  • 列表的分片操作产生的是一个新的列表,其内存地址和之前的内存地址不一样
l = [1,3,5,7,9,11,13]

print(l[1:6:1]) #第三位数控制步长增长

结果:[3,5,7,9,11]

print(l[1:6:2])

结果:[3,7,11]
  • 下标值可以为负数,如果为负数,表明顺序从右往左,规定列表的最后一个数的下标为-1

  • 右边的下标要比左边小

l = [1,3,5,7,9,11,13]

print(l[-4:-1]) 

结果:[7,9,11]

  • 如果非要右边的数比左边大,则步长必须为负数
l = [1,3,5,7,9,11,13]

print(l[-1:-4:-1]) 

结果:[13,11,9]  #注:不管怎样,永远都是左闭右开

  • 分片操作产生的是一个新的列表,内存地址不一样
l = [1,3,5,7,9,11]
ll = l[:]
lll = ll

print(id(l))
print(id(ll))
print(id(lll))

结果:l与ll的地址不相同,ll与lll的地址相同

4 传值和传址

  • 区别

  • 简单的数值采用传值,只改变变量的值,不会改变变量的地址,即在函数内部的操作不会影响到外部变量

  • 负责的变量采用传址,不仅会改变变量的值,而且会改变其地址,即在函数内部的操作也会影响到外部的变量

def func1(n):
    n = 100
    print(n,id(n))

def func2(n):
    n[3] = 200
    print(n,id(n))

a = 9
print(a,id(a))
func1(a)
print(a,id(a))

l = [1,2,3,4,5]
print(l,id(l))
func2(l)
print(l,id(l))

结果:

9 94184610553312
100 94184610556224
9 94184610553312
[1, 2, 3, 4, 5] 139678399193160
[1, 2, 3, 200, 5] 139678399193160
[1, 2, 3, 200, 5] 139678399193160
  • 可以看出,函数func1仅仅只是将变量a的值传过去,而函数func2将值和地址都传过去了
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,884评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,212评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,351评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,412评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,438评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,127评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,714评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,636评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,173评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,264评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,402评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,073评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,763评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,253评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,382评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,749评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,403评论 2 358

推荐阅读更多精彩内容