列表
1.创建列表
创建一个列表非常简单,我们只需要使用中括号,把所有准备放入列表中的元素包裹起来,不同元素之间使用逗号分隔:
>>> list_1 = [1,2,3,4,5,"笑白君"]
>>> print(list_1)
[1, 2, 3, 4, 5, '笑白君']
>>>
2.访问列表中的元素
如果希望按顺序访问列表的每一个元素,可以使用for 循环语句。
>>> for x in list_1:
print(x)
1
2
3
4
5
笑白君
>>>
如果希望指定访问其中一个元素,那么可以使用下标索引的方法:
>>> list_1[0]
1
>>> list_1[1]
2
>>> list_1[2]
3
>>> list_1[-1]
'笑白君'
序列类型数据都可以使用下标索引的方法,第一个元素的下标是0,第二个的下标是1,以此类推。
Python还支持我们”倒着“进行索引。如 list_1[-1] >>> ‘笑白君’
列表切片
将原先的单个索引值改成一个范围可实现即可实现切片:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4kOH46Wm-1615389612028)(C:\Users\君莫笑\AppData\Roaming\Typora\typora-user-images\image-20210224222908400.png)]
切片访问中[0:6] --> (0,6]
>>> list_1[2:5] # [2:5]->(2,5] 所以是第3个元素开始
[3, 4, 5]
>>> list_1[2:6] # 同上 (2,6]
[3, 4, 5, '笑白君']
添加元素到列表
1.增 (向列表添加数据)
向列表添加元素可以使用append()方法,它的功能是在列表的末尾添加一个指定的元素。
>>> heros.append('马红俊')
>>> heros
['唐三','小舞','马红俊']
append( ) 方法虽好,不过每一次只能添加一个元素到列表中,而extend()方法则允许一次性添加多个因素。
extend() 方法则允许一次性添加多个元素:
>>> heros.extend["宁荣荣","比比东","戴沐白"]
>>> heros
['唐三','小舞','马红俊','宁荣荣','比比东','戴沐白']
注意: extend() 方法的参数必须是一个可迭代对象,然后新的内容是追加到原列表最后一个元素的后面。
扩展:
切片向列表添加
>>> s = [1, 2, 3, 4, 5]
>>> # 下面的做法等同于 s.append(6)
>>> s[len(s):] = [6]
>>> s
[1, 2, 3, 4, 5, 6]
>>> # 下面的做法等同于 s.extend([7, 8, 9])
>>> s[len(s):] = [7, 8, 9]
>>> s
[1, 2, 3, 4, 5, 6, 7, 8, 9]
向列表中插入数据
insert() 方法允许你在列表的任意位置添加数据。
insert() 方法有两个参数,第一个参数指定的是插入的位置(从0开始算第一个),第二个参数指定的是插入的元素。
例:
>>> s = [1, 3, 4, 5]
>>> s.insert(1, 2) # 1 下标是 第二个元素, 插入数字2(元素)
>>> s
[1, 2, 3, 4, 5]
删(删除列表中的数据)
利用 remove() 方法, 可以将列表中指定的元素删除。
>>> heros.remove('比比东')
>>> heros
['唐三','小舞','马红俊','宁荣荣','戴沐白'] # 删除了'比比东'
Attention:
· 如果列表中存在多个匹配的元素,那么它只会删除第一个。
>>> s = ['唐三','千仞雪','千仞雪']
>>> s
['唐三', '千仞雪', '千仞雪']
>>> s.remove('千仞雪')
>>> s
['唐三', '千仞雪']
>>>
· remove() 方法是通过remove() 删除指定的内容。
>>> Q
['唐三', '马红俊', '宁荣荣', '戴沐白']
>>> Q.remove('宁荣荣') # 通过选取内容直接删除
>>> Q
['唐三', '马红俊', '戴沐白']
>>>
要求你指定某个位置上的元素,那么可以使用pop() 方法,那么它的参数就是元素的下标索引值:
>>> Q = ['唐三','小舞','马红俊','宁荣荣','戴沐白']
>>> Q
['唐三', '小舞', '马红俊', '宁荣荣', '戴沐白'] # 存在小舞
>>> Q.pop(1) # 通过元素下标索引进行删除。
'小舞'
>>> Q
['唐三', '马红俊', '宁荣荣', '戴沐白']
>>>
pop() 函数, 如果你没有指定一个参数的话,那么它默认"弹"出来的就是最后一个元素了。
>>> Q
['唐三', '马红俊', '戴沐白']
>>> Q.pop()
'戴沐白'
>>>
清空列表
如果想要一步到位清空列表,可以使用 clear() 方法。
>>> Q
['唐三', '马红俊']
>>> Q.clear()
>>> Q
[]
>>>
思维导图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qmEaIO5A-1615389612030)(C:\Users\君莫笑\AppData\Roaming\Typora\typora-user-images\image-20210225154029779.png)]
改(修改列表中的元素)
列表跟字符串最大区别就是:列表是可变的,而字符串是不可变的。
替换列表中的元素跟访问元素类似,都是使用下标索引的方法,然后使用赋值运算符将新的值给替换进去了。
>>> heros = ['唐三','小舞','戴沐白','奥斯卡','马红俊','宁荣荣','朱竹青']
>>> heros[4] = '笑白君'
>>> heros
['唐三', '小舞', '戴沐白', '奥斯卡', '笑白君', '宁荣荣', '朱竹青']
>>>
如果有连续的多个元素需要替换,可以利用切片来实现:
>>> heros
['唐三', '小舞', '戴沐白', '奥斯卡', '笑白君', '宁荣荣', '朱竹青']
>>>
>>> heros[2:] = ['小白','小奥','小君']
>>> heros
['唐三', '小舞', '小白', '小奥', '小君']
>>>
排序与反转
排序
>>> num
[3, 1, 9, 6, 8, 3, 5, 3]
>>> num.sort()
>>> num
[1, 3, 3, 3, 5, 6, 8, 9]
反转: sort() 方法还可以实现排序后翻转
>>> num
[1, 3, 3, 3, 5, 6, 8, 9]
>>> num.sort(reverse=True)
>>> num
[9, 8, 6, 5, 3, 3, 3, 1]
>>>
查 (定位列表中的元素)
如果我们想知道 num 这个列表中到底有多少个3或多少个5,可以使用 count() 方法:
>>> num
[9, 8, 6, 5, 3, 3, 3, 1]
>>> num.count(3)
3
>>> num.count(5)
1
>>>
如果我们要查找heros列表中,'小君’的索引值,可以使用 index() 方法
>>> heros
['唐三', '小舞', '小白', '小奥', '小君']
>>> heros.index('小君')
4
另外,index() 方法有两个可选的参数 – start 和 end, 就是指定查找的开始和结束下标位置:
>>> num
[9, 8, 6, 5, 3, 3, 3, 1]
>>> num.index(3,1,7) # index(3,1,7) 从第1个索引到第7个索引查找第一个3的索引值。
4
>>>
拷贝列表
列表还有一个方法叫 copy(), 用于拷贝一个列表:
>>> num_copy1 = num.copy()
>>> num_copy1
[9, 8, 6, 5, 3, 3, 3, 1]
>>>
也可以使用切片的语法来实现列表拷贝:
>>> num
[9, 8, 6, 5, 3, 3, 3, 1]
>>> num_copy2 = num[:]
>>> num_copy2
[9, 8, 6, 5, 3, 3, 3, 1]
>>>
attention: 以上两种拷贝方法都是浅拷贝。
思维导图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eW0yeXks-1615389612032)(C:\Users\君莫笑\AppData\Roaming\Typora\typora-user-images\image-20210225165736767.png)]
列表的加法和乘法
>>> 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]
>>>
嵌套列表
>>> martix = [[1,2,3],[4,5,6],[7,8,9]] # 嵌套列表例子
>>> martix
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> martix = [[1,2,3],
[4,5,6], # 虽然打印的效果与上面一样,但是这书写程序显得更为直观。毕节嵌套列表相当于二维。
[7,8,9]]
>>> martix
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
访问嵌套列表
>>> martix
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>>
>>>
>>> for i in martix:
for each in i:
print(each)
1
2
3
4
5
6
7
8
9
>>>
>>> for i in martix:
for each in i:
print(each,end=' ')
print() # print() 可以打出空格可以空行
1 2 3
4 5 6 # 每次访问一个列表就换行(print())
7 8 9
>>>
用索引访问嵌套列表
1 2 3
4 5 6
7 8 9
>>> martix[0][0] # 第一行第一列
1
>>> martix[1][1]
5
>>> martix[2][2]
9
>>>
A的嵌套方式
>>> 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]]
>>>
B的嵌套方式
>>> B = [[0] * 3 ] * 3
>>> B
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> A
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> A[1][1] = 1
>>> A
[[0, 0, 0], [0, 1, 0], [0, 0, 0]] # 我们改变的是第2行2列元素改为1
>>>
>>> B
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> B[1][1] = 1 #我们同样也改变B的第2行2列元素改为1
>>> B
[[0, 1, 0], [0, 1, 0], [0, 1, 0]] # 但是我们可以发现第2列的每一行都改变了
>>> # 因为刚开始得到嵌套列表的方式都是错误的。
is 运算符
is 运算符 是用于检验两个变量是否指向同一个对象的一个运算符。
>>> x = 'fishc'
>>> y = 'fishc'
>>> x is y
True
>>>
# 本来没啥事,但是我发现字符串里面是中文是竟然返回的是False
>>> x = [1,2,3]
>>> y = [1,2,3]
>>> x is y
False
>>>
这说明Python对不同的数据类型存放是不一样的。我们可以这么理解
:因为字符串是不可变的,所以Python将它存在了同一个位置。
而数组,Python不知道你什么时候要添加新的东西进去,所以就算是相同的内容,它也会把它放在不同的内存。
变量不是盒子
变量就是一个名字 一个标签,它只是起到引用的作用。
>>> x = [1,2,3]
>>> y = x # 例如 y 它只是引用的 x 的内容
>>> x[1] = 4
>>> y # 当你改变的是x的内容 y 也会跟着变
[1, 4, 3]
>>>
如果需要复制列表,就需要拷贝。
拷贝
浅拷贝和深拷贝
浅拷贝
.copy() 方法
>>> x = [1,2,3]
>>> y = x.copy()
>>> x[1] = 1
>>> x
[1, 1, 3]
>>> y
[1, 2, 3]
>>>
这样y 复制的是整个x的信息,x 的改变并不会影响y.
切片式拷贝:
>>> x = [1,2,3]
>>> y = x[:] # 没有设置起始和结尾,所以拷贝的是全部
>>> x
[1, 2, 3]
>>> y
[1, 2, 3]
>>> x[1] = 1
>>> x
[1, 1, 3]
>>> y
[1, 2, 3]
>>>
官方式拷贝:
>>>
>>> import copy
>>> x = [[1,2,3],[4,5,6],[7,8,9]]
>>> y = copy.copy(x)
以上都是浅拷贝。
深拷贝
那么为什么还要深拷贝。因为如果碰到的是嵌套列表时,同样的结果会出现。
如:
>>> x = [[1,2,3],[4,5,6],[7,8,9]]
>>> y = x.copy()
>>> x
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> y
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> x[1][1] = 0
>>> x
[[1, 2, 3], [4, 0, 6], [7, 8, 9]]
>>> y
[[1, 2, 3], [4, 0, 6], [7, 8, 9]]
>>>
结果:明明改变的是 x 里的,y 也跟着改变了。
如何实现深拷贝
>>> x = [[1,2,3],[4,5,6],[7,8,9]]
>>>
>>> import copy
>>> x = [[1,2,3],[4,5,6],[7,8,9]]
>>> y = copy.deepcopy(x)
>>> x[1][1] = 0
>>> x
[[1, 2, 3], [4, 0, 6], [7, 8, 9]]
>>> y
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>>
这样不管你嵌套多少(套多少娃)就可以都(深)拷贝下来了。
Conclusion
所以如果不需要嵌套列表,用浅拷贝就可以了,(浅拷贝方法多样,任取一样即可)
如果需要复制嵌套列表,要用深拷贝。
列表推导式上
思考:列表的所有元素都是数值,请问如何将列表中的每一个元素的值都变成原来的2倍呢?
我们通常会使用循环:
>>>oho = [1,2,3,4,5]
>>> 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]
循环和列表推导式相比并不是少了一行代码,而是由于列表推导式是直接用C运行的,在效率上比循环快上1倍。
基本语法
[expression for target in iterable]
例子:
>>> x = [i for i in range(10)]
>>> x
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 列表推导式 让列表的每个数值+1
>>> x = [i+1 for i in range(10)] # 表达式加一,全部也会加一。
>>> x
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>>
# 循环式加一
>>> x = []
>>> for i in range(10):
x.append(i+1)
>>> x
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
列表推导式与字符串
同样,列表推导式也适用于字符串。
>>> y = [c * 2 for c in "Fishc"]
>>> y
['FF', 'ii', 'ss', 'hh', 'cc']
借用列表推导式来转换字符串对应的编码:
>>> code = [ord(c) for c in "Fishc"]
>>> code
[70, 105, 115, 104, 99]
提取矩阵的元素:
>>> matrix = [[1,2,3],
[4,5,6],
[7,8,9]]
>>> col2 = [row[1] for row in matrix]
>>> col2
[2, 5, 8]
提取矩阵的主对角线的元素:
>>> matrix = [[1,2,3],
[4,5,6],
[7,8,9]]
>>> diag = [matrix[i][i] for i in range(len(matrix))]
>>> diag
[1, 5, 9]
提取矩阵的辅对角线的元素:
>>> diag = [matrix[i][2-i] for i in range(len(matrix))]
>>> diag
[3, 5, 7]
>>>
个人测试记录:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EerujVsN-1615389612035)(C:\Users\君莫笑\AppData\Roaming\Typora\typora-user-images\image-20210227120836614.png)]
列表推导式和循环列表的区别
在效果上两者并无不同。
在实质上:
循环列表是通过迭代修改列表里的值。
列表推导式是直接创建出一个新列表,然后赋值到原先的变量名。
列表推导式下
上回顾:如果想要将一个嵌套列表(创建出来的数字矩阵),对某个位置上的数字进行修改,我们该怎么改?:
# 以下是错误示范的创建列表
>>> B = [[0] * 3] * 3
>>> B
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> B[1][1]
0
>>> B[1][1] = 1
>>> B
[[0, 1, 0], [0, 1, 0], [0, 1, 0]]
# 正确示范:
>>> A = [0] * 3
>>> for i in range(3):
A[i] = [0] * 3
>>> A
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> A[1][1] = 1
>>> A
[[0, 0, 0], [0, 1, 0], [0, 0, 0]]
>>>
在不使用列表推导式的情况下,我们只能通过写循环来进行创建。
列表推导式+
列表推导式还可以添加一个用于筛选的 if 分句。
语法:[expression for target in iterable if condition]
# 0~9内除余2为0的数(偶数)
>>> [i for i in range(10) if i % 2 == 0]
[0, 2, 4, 6, 8]
>>>
# 可以看出[]里的运行顺序,先for->if->i+1.
>>> [i+1 for i in range(10) if i % 2 == 0]
[1, 3, 5, 7, 9]
>>>
案例:查找字符里有F的单词
words = ["Great","FishC","Brilliant","Excellent","Fantatistic"]
>>> fwords = [w for w in words if w[0] == 'F']
>>> fwords
['FishC', 'Fantatistic'] # 筛选成功
列表推导式++
嵌套的列表推导式对应嵌套的循环。
语法:[expression for target1 in iterable1
for target2 in iterable2
…
for targetN in iterableN]
eg:将二维列表降为一维列表:
>>> matrix = [[1,2,3], [4,5,6], [7,8,9]]
>>> flatten = [col for row in matrix for col in row]
>>> flatten # 列表推导式
[1, 2, 3, 4, 5, 6, 7, 8, 9]
# --------------------------------------
# 循环
>>> matrix = [[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]
再来一个案例:
# 列表推导式++
>>> flatten
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> [x + y for x in "fiscc" for y in "FISHC"]
['fF', 'fI', 'fS', 'fH', 'fC', 'iF', 'iI', 'iS', 'iH', 'iC', 'sF', 'sI', 'sS', 'sH', 'sC', 'cF', 'cI', 'cS', 'cH', 'cC', 'cF', 'cI', 'cS', 'cH', 'cC']
>>>
# ---------------------------------------------
>>> # 循环
>>> _ = []
>>> for x in "fischc":
for y in "FISHC":
_.append(x + y)
>>> _
['fF', 'fI', 'fS', 'fH', 'fC', 'iF', 'iI', 'iS', 'iH', 'iC', 'sF', 'sI', 'sS', 'sH', 'sC', 'cF', 'cI', 'cS', 'cH', 'cC', 'hF', 'hI', 'hS', 'hH', 'hC', 'cF', 'cI', 'cS', 'cH', 'cC']
>>>
还有列表推导式+++就不写了:语法在下面。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JH8oqmPg-1615389612037)(C:\Users\君莫笑\AppData\Roaming\Typora\typora-user-images\image-20210301230418380.png)]
conclusion:kiss 原则
Keep It Simple & Stupid
简单胜于复杂
以人为本
本文详细介绍Python列表的基础操作,包括创建、访问、增删改查等,并深入探讨排序、拷贝及列表推导式的高效运用。
1436

被折叠的 条评论
为什么被折叠?



