列表
列表元素
>>> list = [1, 2, 3, 4, 5, '上山打老虎']
>>> print(list)
[1, 2, 3, 4, 5, '上山打老虎']
for循环遍历列表元素,下标索引访问列表单个元素list[0]、list[1]
长列表访问列表最后一个元素list[-1]、list[len(list) - 1],索引带符号为反向索引。
>>> rhyme = [1, 2, 3, 4, 5, '上山打老虎']
>>> for each in rhyme
>>> print(each)
1
2
3
4
5
上山打老虎
>>> rhyme[0]
1
>>> rhyme[5]
'上山打老虎'
>>>rhyme[-1]
'上山打老虎'
列表切片
list[start: stop: step]
>>> rhyme[0:3]
[1,2,3]
>>> rhyme[:3]
[1,2,3]
>>> rhyme[3:]
[4,5,'上山打老虎']
>>> rhyme[:]
[1, 2, 3, 4, 5, '上山打老虎']
>>> rhyme[::-1] #倒叙输出
['上山打老虎', 5, 4, 3, 2, 1]
列表方法
增
append(),在列表末尾添加一个指定元素
>>> list=[1,2,3,4,5,'上山打老虎']
>>> list.append('老虎打不到')
>>> list
[1, 2, 3, 4, 5, '上山打老虎', '老虎打不到']
extend(),向列表中最后一个元素后面添加一个可迭代对象
>>> list.extend(['打到小松鼠',5])
>>> list
[1, 2, 3, 4, 5, '上山打老虎', '老虎打不到', '打到小松鼠', 5]
insert(x, y):向列表指定x位置插入元素y,x:指定的插入位置,y:插入的元素
>>> l = [1, 2, 3, 4, 5, 6, 7, 8]
>>> l.insert(len(l),9)
>>> l
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>l.insert(1,2)
[1, 2, 2, 3, 4, 5, 6, 7, 8, 9]
使用切片法实现
>>> l = [1, 2, 3, 4]
>>> l[len(l):] = [5]#相当于append()
>>> l
[1, 2, 3, 4, 5]
>>> l[len(l):] = [6,7,8]#相当于extend()
>>> l
[1, 2, 3, 4, 5, 6, 7, 8]
>>> l[1:1] = [2]#相当于insert()
>>> l
[1, 2, 2, 3, 4, 5, 6, 7, 8]
>>> l[3:3] = [3,3]
>>> l
[1, 2, 2, 3, 3, 3, 4, 5, 6, 7, 8]
删
remove():删除指定元素。若列表中存在多个匹配的元素,只会删除第一个。若指定元素不存在,则程序报错。
>>> list = [1, 2, 2, 3, 4, 5]
>>> list.remove(2)
>>> list
[1, 2, 3, 4, 5]
>>> list.remove(6)
Traceback (most recent call last):File "<pyshell#1>", line 1, in <module>list.remove(6)
ValueError: list.remove(x): x not in list
pop():参数为下标,打印并删除指定下标的元素
>>> list = [1, 0, 2, 4, 8]
>>> list.pop(4)
8
>>> list
[1, 0, 2, 4]
clear():清空列表所有元素
>>> list.clear()
>>> list
[]
改
赋值更改对应下标的元素
>>> list = [1, 2, 3, 4, 7]
>>> list[4] = 5
>>> list
[1, 2, 3, 4, 5]
切片更改
>>> list = [1, 2, 3, 4, 7]
>>> list[4:5] = [5]
>>> list
[1, 2, 3, 4, 5]
>>> list[2:] = [4, 8, 16]
>>> list
[1, 2, 4, 8, 16]
>>> nums = [3, 4,5,7,1,3,9]
>>> nums.sort()
>>> nums
[1, 3, 3, 4, 5, 7, 9]
>>> nums.reverse()
>>> nums
[9, 7, 5, 4, 3, 3, 1]
查
count():返回参数的元素所出现的次数
index(x, start, end):x:查找元素x的索引值,多个相同元素返回第一个下标。start、end:指定查找的开始结束位置。
copy():以及切片实现copy()都是浅拷贝。
>>> list = [1, 3, 4, 5, 5, 7, 9, 32]
>>> list.count(5) #查找5出现的次数
2
>>> list.index(5) #查找5的索引值
3
>>> list.index(5, 4, 7) #从位置4开始找到位置7,查元素5
4
>>> list1 = list.copy() #拷贝一个列表
>>> list1
[1, 3, 4, 5, 5, 7, 9, 32]
>>> list2 = list[:]#使用切片实现copy()
>>> list2
[1, 3, 4, 5, 5, 7, 9, 32]
列表的加法和乘法
s = [1, 2, 3]
t = [4, 5, 6]
s+t
[1, 2, 3, 4, 5, 6]
s*3
[1, 2, 3, 1, 2, 3, 1, 2, 3]
嵌套列表
二维列表,矩阵
访问嵌套列表需要使用嵌套循环实现
matrix = [[1,2,3],[4,5,6],[7,8,9]]
matrix = [[1,2,3],[4,5,6],[7,8,9]]
访问嵌套列表
for i in matrix:for each in i:print(each)
1
2
3
4
5
6
7
8
9matrix[0]
[1,2,3]
matrix[0][1]
2
matrix[2][2]
9
A = [0] * 3
A
[0, 0, 0]
for i in range(3):A[i] = [0]*3
A
[[0,0,0],[0,0,0],[0,0,0]]
#重点错误点
>>> A = [[0] * 3] * 3#不能使用该方法创建列表
>>> A
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> A[0][0] = 1
>>> A
[[1, 0, 0], [1, 0, 0], [1, 0, 0]]#会出现该错误
>>> A[0] is A[1] #原因在于使用该方法创建的列表每一行都指向了同一个对象
True
>>> A[1] is A[2]
True
#试图通过乘号对嵌套列表进行拷贝,但是是对同一个列表的引用进行了重复。
>>> x =[1,2,3]
>>> y =[1,2,3]
>>> x is y
False
#Python对于不同对象的存储机制是不一样的
is:同一性运算符,检验两个变量是否指向同一个对象
浅拷贝和深拷贝
copy()和切片都是浅拷贝
x = [1,2,3]
y = x
x[0] = 4
x
[4,2,3]
y
[4,2,3]
x的值改变y也会变
x = [1,2,3]
y = x.copy()
x[0] = 4
x
[4,2,3]
y
[1,2,3]
x的值改变不影响y的值
x = [[1,2,3],[4,5,6],[7,8,9]]
y = x.copy()
x[1][1] = 0
x
[[1,2,3],[4,0,6],[7,8,9]]
y
[[1,2,3],[4,0,6],[7,8,9]]
当对嵌套列表使用copy()时只会拷贝最外层,内层的列表依然是传递的引用
深拷贝需要用到copy模块,copy模块包含两个函数,其中的copy()函数依然是浅拷贝,其中的deepcopy()函数实现的是深拷贝,即为拷贝原对象以及其所有子对象
>>> import copy #导入copy模块
>>> x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> y = copy.copy(x) #浅拷贝
>>> y
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> x[1][1] = 0
>>> y
[[1, 2, 3], [4, 0, 6], [7, 8, 9]]>>> y = copy.deepcopy(x) #深拷贝
>>> x[2][2] = 0
>>> x
[[1, 2, 3], [4, 0, 6], [7, 8, 0]]
>>> y
[[1, 2, 3], [4, 0, 6], [7, 8, 9]]
列表推导式
oho = [1,2,3,4,5] #每个元素×2
for i in range(len(oho)):oho[i] = oho[i]*2
oho
[2,4,6,8,10]
#列表推导式,速度会快上一倍
oho = [1,2,3,4,5]
oho = [i*2 for i in oho]
oho
[2,4,6,8,10]
基本语法
[expression for target in iterable]
list = [执行语句 for i in 可迭代对象 ]
>>> x = [i+1 for i in range(10)]
>>> x
[1,2,3,4,5,6,7,8,9,10]
>>> list = [i*2 for i in 'love']
>>> list
['ll', 'oo', 'vv', 'ee']
>>> list = [ord(i) for i in 'love'] #ord()将单个字符串转化为内置编码
>>> list
[108, 111, 118, 101]
矩阵提取数据
matrix = [[1,2,3],[4,5,6],[7,8,9]]
#使用列表推导式,将一个三阶二维矩阵的第二列提取出来
>>> col2 = [row[1] for row in matrix]
>>> col2
[2, 5, 8]#使用列表推导式,将一个三阶二维矩阵的主对角线元素提取出来
>>> list = [matrix[i][i] for i in range(3)]
>>> list
[1, 5, 9]#使用列表推导式,将一个三阶二维矩阵的次对角线元素提取出来
>>> list = [matrix[i][len(matrix)-i-1] for i in range(len(matrix))]
>>> list
[3, 5, 7]
循环与列表推导式的区别:循环通过迭代来逐个修改原列表中的元素,列表推导式则是创建一个新的列表然后赋值给原列表变量
使用列表推导式,创建一个二维列表
>>> list = [[0]*3 for i in range(3)]
>>> list
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> list[0][0] = 1
>>> list
[[1, 0, 0], [0, 0, 0], [0, 0, 0]]
列表推导式的if分句
[expression for target in iterable if condition]
list = [执行语句 for i in 可迭代对象 if 满足的条件]
#先执行for语句、在执行if、最后执行左侧执行语句
even = [i+1 for i in range(10) if i % 2 == 0]#筛选偶数,并+1
even
1,3,5,7,9words = ["Great", "FishC", "Brilliant" "Excellent", "Fantastic"]
fwords = [i for i in words if i[0] == 'F']
fwords
['FishC', 'Fantastic']
嵌套列表推导式
[expression for target1 in iterable1for target2 in iterable2 ......for targetN in iterableN ] [执行语句 for i in 可迭代对象1for j in 可迭代对象2......for N in可迭代对象N ]
matrix = [[1,2,3],[4,5,6],[7,8,9]]
flatten = [col for row in matrx for col in row]
flatten
[1,2,3,4,5,6,7,8,9]
#转换成循环
flatten = []
for row in matrix:for col in row:flatten.append(col)
flatten
[1,2,3,4,5,6,7,8,9][x + y for x in "fishc" for y in "FISHC"]
['fF', 'fI', 'fS', 'fH', 'fC', 'iF', 'iI', 'iS', 'iH', 'iC', 'sF', 'sI', 'sS', 'sH', 'sC', 'hF', 'hI', 'hS', 'hH', 'hC', 'cF', 'cI', 'cS', 'cH', 'cC']
#转换成循环
_ = [] #临时变量名
for x in "fishc":for y in "FISHC":_.append(x+y)
_
['fF', 'fI', 'fS', 'fH', 'fC', 'iF', 'iI', 'iS', 'iH', 'iC', 'sF', 'sI', 'sS', 'sH', 'sC', 'hF', 'hI', 'hS', 'hH', 'hC', 'cF', 'cI', 'cS', 'cH', 'cC']
列表推导式完整语法
[expression for target1 in iterable1 if condition1 for target2 in iterable2 if condition2 ......for targetN in iterableN if conditionN] [执行语句 for i in 可迭代对象1 if 满足的条件1for j in 可迭代对象2 if 满足的条件2......for N in可迭代对象N if 满足的条件N]
[[x,y] for x in range(10) if x % 2 == 0 for y in range(10) if y % 3 == 0]
[[0, 0], [0, 3], [0, 6], [0, 9], [2, 0], [2, 3], [2, 6], [2, 9], [4, 0], [4, 3], [4, 6], [4, 9], [6, 0], [6, 3], [6, 6], [6, 9], [8, 0], [8, 3], [8, 6], [8, 9]]#转换成循环
>>> list = []
>>> for x in range(10):if x%2==0:for y in range(10):if y%3==0:list.append([x,y])
编程kiss原则:keep it simple and stupid
