Python学习之列表

本文详细介绍Python列表的基础操作,包括创建、访问、增删改查等,并深入探讨排序、拷贝及列表推导式的高效运用。

列表

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

简单胜于复杂

以人为本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值