目录
一、操作列表
1.嵌套列表
matrix=[[1,2,4],
[8,5,7]
[4,6,9]]
2.列表的常用操作符
比较:如果有多个元素,默认从第一个元素开始比较,比较对应的ASCII码值大小;
逻辑(and or)
连接(+):[1, 2, 3] + [4, 5, 6] 结果是 [1, 2, 3, 4, 5, 6]
重复(*):['Hi!'] * 4 结果是 ['Hi!', 'Hi!', 'Hi!', 'Hi!']
成员关系(in 和 not in):3 in [1, 2, 3] 结果是 True
is运算符:用于检验俩个变量是否指向同一个对象,是否在同一地址中,Python对不同对象的储存机制是不一样的,is 用于判断两个变量引用对象是否为同一个, == 用于判断引用变量的值是否相等
>>> x is y
True
>>> x="我是一个字符串"
>>> y="我是一个字符串"
>>> x is y
False
>>> x=[1,2,3]
>>> y=[1,2,3]
>>> x is y
False
>>>
遍历列表
>>> c #一维
[9, 6, 5, 4, 4, 4, 2, 1, '新元素']
>>> for i in a:
print(i)
9
6
5
4
4
4
2
1
新元素
>>> matrix=[[1,2,4],#二维
[8,5,7],
[4,6,9]]
>>> for i in matrix:
for j in i:
print(j)
1
2
4
8
5
7
4
6
9
>>> for i in matrix:
for j in i:
print(j,end=' ') #以空格隔开内层元素,使其在一行[1,2,3]
1 2 4 8 5 7 4 6 9
>>> for i in matrix:
for j in i:
print(j,end=' ') #以空格隔开内层元素,使其在一行
print() #使外层元素在一列
1 2 4
8 5 7
4 6 9
>>>
注意:变量常常被描述为一个盒子,用来存储值,但变量实际上是指向特定值的一个标签
深浅拷贝:copy()方法拷贝的是整个列表对象,而不仅仅是变量的引用,为浅拷贝(切片方法也是浅拷贝),浅拷贝只是拷贝了外层的对象,如果是嵌套列表的话拷贝的只是其引用。
深拷贝要用到copy模块:import copy,deepcopy在原对象拷贝的同时,也将原对象内部所有引用的子对象一并进行了拷贝,多层嵌套的化也会全部考虑,但为了效率默认为浅拷贝。
>>> x=[[1,3,2],
[5,4,6],
[8,9,7]]
>>> y=x.copy() #列表的copy方法
>>> y
[[1, 3, 2], [5, 4, 6], [8, 9, 7]]
>>> x[1][1]=0
>>> y
[[1, 3, 2], [5, 0, 6], [8, 9, 7]]
>>> import copy #引入copy模块
>>> y=copy.copy(x) #copy模块的copy函数
>>> y
[[1, 3, 2], [5, 0, 6], [8, 9, 7]]
>>> x[1][1]=4
>>> y
[[1, 3, 2], [5, 4, 6], [8, 9, 7]]
>>> y=copy.deepcopy(x) #copy模块的deepcopy函数,深拷贝
>>> y
[[1, 3, 2], [5, 4, 6], [8, 9, 7]]
>>> x[1][1]=0
>>> y
[[1, 3, 2], [5, 4, 6], [8, 9, 7]]
>>> x
[[1, 3, 2], [5, 0, 6], [8, 9, 7]]
>>>
二、列表推导式
在python中以C语言的速度来运行,而不是python脚本的虚拟机pvm以步进执行效率更高比直接用for循环提高1倍效率格式:[与目标对象有关的表达式 for 对象目标 in 操作列表]
1.创建二维列表
代码如下(示例):
>>> s=[[2]*3 for i in range(3)]
>>> s
[[2, 2, 2], [2, 2, 2], [2, 2, 2]]
>>> s[1][1]=0
>>> a
[9, 6, 5, 4, 4, 4, 2, 1, '新元素']
>>> s
[[2, 2, 2], [2, 0, 2], [2, 2, 2]]
2.扩大为原来的二倍
>>> a=[3,2,4,5,1]
>>> b=[i*2 for i in a] #b的值为a的2倍
>>> c=[i*2] #直接乘2报错
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
c=[i*2]
NameError: name 'i' is not defined
>>> c=a*2 #c扩充为含两次a元素的列表
>>> b
[6, 4, 8, 10, 2]
>>> c
[3, 2, 4, 5, 1, 3, 2, 4, 5, 1]
>>> c=[a*2]
>>> c
[[3, 2, 4, 5, 1, 3, 2, 4, 5, 1]] #c扩充为以含两次a元素的列表为元素的列表
>>> b
>>>
>>> c=a*2
>>> c[3]=0
>>> c
[3, 2, 4, 0, 1, 3, 2, 4, 5, 1] #由此可见a*2
>>>
3.筛选生成
执行顺序
代码如下(示例):
>>> even=[i for i in range(12) if i%2==0]#筛选生成列表
>>> even
[0, 2, 4, 6, 8, 10]
>>> words=["father","mather","fff","hhh","tytu"]
>>> fhead=[i for i in words if w[0]=="f"]
>>> fhead=[i for i in words if i[0]=="f"]
>>> fhead
['father', 'fff']
>>>
4.提取第行列,行line[],列row[]
>>> y=[row[1] for row in x]#提取第行列,行line[],列row[]
>>> y
[3, 4, 9]
>>> y=[x[i][2-i] for i in range(len(x))]
>>> y
[2, 4, 8]
5.循环和列表表达式区别
循环是逐个迭代修改原列表的值,列表表达式是创建一个新的列表然后赋值给原来的变量名