列表的常见操作
增
- append()
li=['city','college']
print(id(li))
li1=['a','b','c']
li.append(li1)
print(id(li))
print(li)
#输出
55457232
55457232
['city', 'college', ['a', 'b', 'c']]
sr='城市学院'
li= []
for i in sr:
li.append(ord(i))
print(li)
#输出
[22478, 24066, 23398, 38498]
- extend()
li=['city','college']
li.extend('abcded')
print(li)
#输出
['city', 'college', 'a', 'b', 'c', 'd', 'e', 'd'] #注意与append的区别,extend是将元素拆分后添加进列表
- insert()
li=['city','college']
li.insert(1,'abcded')
print(li)
#输出
['city', 'abcded', 'college']
改
- 直接根据下标重新赋值
li=['city','college',1,2,3,4]
li[5]='abc'
print(li)
li[1:4]=['a','b','c','d',9,7,5,2]
print(li)
li[1:4]=['AJISBDIU']
print(li)
#输出
['city', 'college', 1, 2, 3, 'abc']
['city', 'a', 'b', 'c', 'd', 9, 7, 5, 2, 3, 'abc']
['city', 'AJISBDIU', 'd', 9, 7, 5, 2, 3, 'abc']
删除
- -pop
- 如果不指定索引默认参数最后一个
- 如果指定了,则删除指定索引对应的元素
- 返回值为删除的元素
li=['city', 'AJISBDIU', 'd', 9, 7, 5, 2, 3, 'abc']
print(li.pop())
print(li)
print(li.pop(2))
print(li)
#输出
abc
['city', 'AJISBDIU', 'd', 9, 7, 5, 2, 3]
d
['city', 'AJISBDIU', 9, 7, 5, 2, 3]
- del
- 删除列表指定元素或者删除列表
li=['city', 'AJISBDIU', 'd', 9, 7, 5, 2, 3, 'abc','city']
del li[1]
print(li)
del li
# print(li) #li列表已经被删除,会报错li列表未定义
#输出
['city', 'd', 9, 7, 5, 2, 3, 'abc', 'city']
- clear
- 清空列表所有元素
li=['city', 'AJISBDIU', 'd', 9, 7, 5, 2, 3, 'abc','city']
li.clear()
print(li)
#输出
[]
- remove
- 没有返回值
- 移除第一次遇到指定元素
li=['city', 'AJISBDIU', 'd', 9, 7, 5, 2, 3, 'abc','city']
print(li.remove('city'))
print(li)
#输出
None
['AJISBDIU', 'd', 9, 7, 5, 2, 3, 'abc', 'city']
查
- 元素遍历
li=['city', 'AJISBDIU', 'd', 9, 7, 5, 2, 3, 'abc','city']
for i in li:
print(i,end=' ')
#输出
city AJISBDIU d 9 7 5 2 3 abc city
- 索引遍历
li=['city', 'AJISBDIU', 'd', 9, 7, 5, 2, 3, 'abc','city']
for i in range(len(li)):
print(li[i],end=' ')
#输出
city AJISBDIU d 9 7 5 2 3 abc city
- 枚举遍历
- enumerate(),对于一个可迭代的/可遍历的对象,将其组成一个索引序列,利用他,我们可以同时获取索引和值.
li=['city', 'AJISBDIU', 'd', 9, 7, 5, 2, 3, 'abc','city']
for i in enumerate(li,3): #3表示索引开始值,默认0
print(i)
#输出
(3, 'city')
(4, 'AJISBDIU')
(5, 'd')
(6, 9)
(7, 7)
(8, 5)
(9, 2)
(10, 3)
(11, 'abc')
(12, 'city')
其他操作
计数
- count(‘x’)-
- 统计值为x元素出现的次数
li=[9, 7, 5, 2, 3,3,3,3]
li.count(3)
print(li.count(3))
#输出
4
反转
- reverse()
li=[9, 7, 5, 2, 3,3,3,3]
li.reverse()
print(li)
#输出
[3, 3, 3, 3, 2, 5, 7, 9]
排序
- sort()
- 默认从小到大(ASCII码)
li=[9, 7, 5, 2, 3,3,3,3]
li.sort()
print(li)
#输出
[2, 3, 3, 3, 3, 5, 7, 9]
- sort(reverse=True)
- 从大到小
li=[9, 7, 5, 2, 3,3,3,3,4,5,1555]
li.sort(reverse=True)
print(li)
#输出
[1555, 9, 7, 5, 5, 4, 3, 3, 3, 3, 2]
赋值与深浅拷贝
- 赋值是对对象的引用
li1=[1,2,3,4,5,'a','b',['b1','b2']]
li2=li1
print((li1,li2))
print((id(li1),id(li2)))
print(li1 is li2)
li1[5] = 'aaa'
print(li1)
print(li2)
#输出
([1, 2, 3, 4, 5, 'a', 'b', ['b1', 'b2']], [1, 2, 3, 4, 5, 'a', 'b', ['b1', 'b2']])
(88276904, 88276904)
True
[1, 2, 3, 4, 5, 'aaa', 'b', ['b1', 'b2']]
[1, 2, 3, 4, 5, 'aaa', 'b', ['b1', 'b2']]
-
深浅拷贝
-
浅拷贝会创建新对象,内容是原对象的引用
-
三种实现方法:
- 切片操作[:]
li1=[1,2,3,4,5,'a','b',['b1','b2']] li3=li1[:] print((id(li1),id(li3))) print(li1 is li3) li1[5] = 'aaa' print(li1) print(li3) #输出 (93847504, 93809360) False [1, 2, 3, 4, 5, 'aaa', 'b', ['b1', 'b2']] [1, 2, 3, 4, 5, 'a', 'b', ['b1', 'b2']]
- 工厂函数list(li)
- copy模块内的copy函数
import copy li1=[1,2,3,4,5,'a','b',['b1','b2']] li3=copy.copy(li1) print((id(li1),id(li3))) print(li1 is li3) li1.append('test') #添加原子类型,不会影响li3 print(li1) print(li3) print('li1[7]的id:',id(li1[7])) print('li3[7]的id:',id(li3[7])) li1[5] = 'aaa' print(li1) print(li3) print('li1[7]的id:',id(li1[7])) print('li3[7]的id:',id(li3[7])) li1[7][0]='bbb' print(li1) #浅拷贝只拷贝第一层内容,深层次的依然使用指向的方式寻找 print(li3) #此时会修改li1和li3的值,原因为li1[7]和li3[7]指向同一个地址 print('li1[7]的id:',id(li1[7])) print('li3[7]的id:',id(li3[7])) #输出 (19508320, 19507600) False [1, 2, 3, 4, 5, 'a', 'b', ['b1', 'b2'], 'test'] [1, 2, 3, 4, 5, 'a', 'b', ['b1', 'b2']] li1[7]的id: 19466720 li3[7]的id: 19466720 [1, 2, 3, 4, 5, 'aaa', 'b', ['b1', 'b2'], 'test'] [1, 2, 3, 4, 5, 'a', 'b', ['b1', 'b2']] li1[7]的id: 19466720 li3[7]的id: 19466720 [1, 2, 3, 4, 5, 'aaa', 'b', ['bbb', 'b2'], 'test'] [1, 2, 3, 4, 5, 'a', 'b', ['bbb', 'b2']] li1[7]的id: 19466720 li3[7]的id: 19466720
- 浅拷贝相当于只拷贝了一层,修改外层元素,会修改引用,让他指向另外一个位置,修改嵌套列表的元素,列表地址没有发生变化,指向的还是同一个地址。
-
深拷贝
- 使用copy模块的deepcopy
import copy li1=[1,2,3,4,5,'a','b',['b1','b2']] li2=copy.deepcopy(li1) print(li1,'\n',id(li1)) print(li2,'\n',id(li2)) li1[5]='qwe' print(li1,'\n',id(li1)) print(li2,'\n',id(li2)) li1[7][0]='aaa' print(li1,'\n',id(li1)) print(li2,'\n',id(li2)) #输出 [1, 2, 3, 4, 5, 'a', 'b', ['b1', 'b2']] 89828808 [1, 2, 3, 4, 5, 'a', 'b', ['b1', 'b2']] 89860696 [1, 2, 3, 4, 5, 'qwe', 'b', ['b1', 'b2']] 89828808 [1, 2, 3, 4, 5, 'a', 'b', ['b1', 'b2']] 89860696 [1, 2, 3, 4, 5, 'qwe', 'b', ['aaa', 'b2']] #深拷贝拷贝全部层次的内容 89828808 [1, 2, 3, 4, 5, 'a', 'b', ['b1', 'b2']] 89860696
- 深拷贝拷贝对象全部的内容。
-
列表解析式
li=[]
for i in range(10):
li.append(i)
print(li)
print([i for i in range(10)])
#输出
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
列表生成式
- 用来生成列表的特定语法形式
- 格式:
[表达式 for 迭代元素 in 可迭代对象]
- 实现原理
- 迭代[可迭代对象]中的每一个元素
- 每迭代一次的结果赋值给对应的迭代元素,通过表达式运算得到一个新的值
- 最后所有通过表达式计算的值以一个列表的形式返回。
- 带过滤功能格式
[exp for iter_val in iter if if_condtion]
print([i for i in range(10) if i % 2 == 0]) #获取1-10之前的偶数
#输出
[0, 2, 4, 6, 8]
name = ['Tom','jack','Riku']
subject = ['Python','Java','C','C++']
print([ [i,j] for i in name for j in subject])
#输出
[['Tom', 'Python'], ['Tom', 'Java'], ['Tom', 'C'], ['Tom', 'C++'], ['jack', 'Python'], ['jack', 'Java'], ['jack', 'C'], ['jack', 'C++'], ['Riku', 'Python'], ['Riku', 'Java'], ['Riku', 'C'], ['Riku', 'C++']]
-
拓展:
- 三目运算符
y = 55 x = y + 1 if y < 10 else y - 1 #如果y<10 x=y+1,若不成立则x=y-1 print(x) #输出 54
- 一行输出99乘法表
print(’\n’.join([’\t’.join([’%2s %2s=%2s’%(i,j,ij) for j in range(1,i+1)]) for i in range(1,10)]))
#输出
1 * 1= 1
2 * 1= 2 2 * 2= 4
3 * 1= 3 3 * 2= 6 3 * 3= 9
4 * 1= 4 4 * 2= 8 4 * 3=12 4 * 4=16
5 * 1= 5 5 * 2=10 5 * 3=15 5 * 4=20 5 * 5=25
6 * 1= 6 6 * 2=12 6 * 3=18 6 * 4=24 6 * 5=30 6 * 6=36
7 * 1= 7 7 * 2=14 7 * 3=21 7 * 4=28 7 * 5=35 7 * 6=42 7 * 7=49
8 * 1= 8 8 * 2=16 8 * 3=24 8 * 4=32 8 * 5=40 8 * 6=48 8 * 7=56 8 * 8=64
9 * 1= 9 9 * 2=18 9 * 3=27 9 * 4=36 9 * 5=45 9 * 6=54 9 * 7=63 9 * 8= 9 * 9=81