Python标准库中的列表(list)类似于C/C++中的数组。
Python扩展库中的ndarray对象有许多操作和列表(list)的操作类似,比如切片操作、元素访问呢,但它们是两个东西,大家不要搞混了。关于ndarray对象的基本操作,可参考博文 https://blog.csdn.net/wenhao_ir/article/details/124416798
数组对于编程而言其重要性是不言而喻的,所以这篇博文汇总一下Python标准库中的列表(list)的操作。
声明:博主(昊虹图像算法)写这篇博文时,用的Python的版本号为3.9.10。
序列是 Python 中最基本的数据结构。
序列中的每个值都有对应的位置值,称之为索引,第一个索引是 0,第二个索引是 1,依此类推。
序列都可以进行的操作包括索引,切片,加,乘,检查成员。
此外,Python 已经内置确定序列的长度以及确定最大和最小的元素的方法。
Python 有 6 个序列的内置类型,但最常见的是列表和元组。
列表是最常用的 Python 数据类型,列表的数据项不需要具有相同的类型。
创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可。
list1 = ['Google', 'CSDN', 1997, 1999]
list2 = [1, 2, 3, 4, 5]
list3 = ['red', 'green', 'blue', 'yellow', 'white', 'black']
运行结果如下图所示:
从上面的结果中我们可以看出,在Python中是用单词list表示列表的。
列表本质上还是对象,所以可以用构造函数创建,代码如下:
list1 = list()
list1.append('Google')
list1.append('CSDN')
list1.append('1997')
list1.append('1999')
运行结果如下:
从上面来看,显然第1种方法比第2种方法方便。但是当您要使用成员函数append()追加元素时,如果用第一种方法,Pycharm会不建议这么操作,如下图所示:
This list creation could be rewritten as a list literal。
这句话的意思是列表应该按本义创建。什么叫本义创建?列表本质上是个对象,既然对象,那就用构造函数初始化创建呗。
下面的两篇文章都说了这个问题的原因:
https://www.cnblogs.com/jiangxiaobo/p/11622730.html
https://zhuanlan.zhihu.com/p/222401764
示例代码如下:
list1 = ['Google', 'CSDN', 1997, 1999]
print(list1[0])
print(list1[1])
print(list1[2])
list1 = ['Google', 'CSDN', 1997, 1999]
print(list1[-1])
print(list1[-2])
print(list1[-3])
示例代码如下:
list1 = ['Google', 'CSDN', 'tencent', 1997, 1999, 1998]
list2 = list1[0:4]
注意:切片的区间是左闭右开的,即[0:4]相当于[0,4)
运行结果如下:
还可以正索引和负索引相结合:
list1 = ['Google', 'CSDN', 'tencent', 1997, 1999, 1998]
list2 = list1[0:-2]
上面的list1[0:-2]表示截取0到倒数第2个的片段,运行结果如下:
首先说一下,使用方法append()添加列表元素时有可能Pycharm会有下面的建议提示:
This list creation could be rewritten as a list literal。
要消除上面的提示,可以参考我的另一篇博文,链接如下:
https://blog.csdn.net/wenhao_ir/article/details/125414855
使用方法append()添加列表元素的示例代码如下:
list1 = list()
list1.append('Google')
list1.append('CSDN')
list1.append('1997')
list1.append('1999')
运行结果如下:
要特别注意的是:当使用方法append()添加的元素本身也是一个列表时,此时是浅拷贝操作,也就是说被拷贝的列表值改变,那么列表中相应元素的值也会变,示例代码如下:
list1 = list()
list1.append('Google')
list1.append('CSDN')
list1.append('1997')
list1.append('1999')
list2 = [2010]
list1.append(list2)
list2[0] = 4444
运行结果如下:
如果是深拷贝,那么list1中的第4个元素值应该是[2010]才对。
如果想实现列表的深拷贝,可以像下面这样操作:
import copy
list1 = list()
list1.append('Google')
list1.append('CSDN')
list1.append('1997')
list1.append('1999')
list2 = [2010]
list1.append(copy.deepcopy(list2))
list2[0] = 4444
list1.append(copy.deepcopy(list2))
可以换成
list1.append(list2.copy())
对于一般的变量,效果就是深拷贝,代码如下:
list1 = list()
list1.append('Google')
list1.append('CSDN')
list1.append('1997')
list1.append('1999')
value1 = 2030
list1.append(value1)
value1 = 4444
从上面的示例我们可以看出,方法append()是把被追加的列表作一个整体(即作为一个元素)添加到原列表中的,有时候我们希望在列表末尾一次性追加另一个序列中的多个值,这个时候就可以用方法extend()实现。
示例代码如下:
list1 = ['Google', 'CSDN', 'Taobao']
list2 = [1997, 1999, 1998]
list1.extend(list2)
示例代码如下:
list1 = ['Google', 'CSDN', 'Taobao', 1997, 1999, 1998, 1999]
list1.insert(3, 'Tecent')
示例代码如下:
list1 = ['Google', 'CSDN', 'tencent', 1997, 1999, 1998]
del list1[2]
运行结果如下:
从上面的结果来看,第2个元素’tencent’被删除了。
方法pop()语法如下:
list.pop([index=-1])
index – 可选参数,要移除列表元素的索引值,不能超过列表总长度,默认为 index=-1,删除最后一个列表值。
示例代码如下:
list1 = ['Google', 'CSDN', 'tencent', 1997, 1999, 1998]
list2 = ['Google', 'CSDN', 'tencent', 1997, 1999, 1998]
value1 = list1.pop()
value2 = list1.pop(1)
示例代码如下:
list1 = ['Google', 'CSDN', 'tencent', 1997, 1999, 1998, 'CSDN']
list1.remove('CSDN')
运行结果如下:
从上面的运行结果可知,方法remove()移除的是第一个匹配到的元素。上面的字符串元素’CSDN’有两个,但只被删了第一个。
示例代码如下:
len1 = len([1, 2, 3])
list1 = ['Google', 'CSDN', 'tencent', 1997, 1999, 1998]
len2 = len(list1)
示例代码如下:
list1 = [456, 700, 200]
max1 = max(list1)
示例代码如下:
list1 = [456, 700, 200]
min1 = min(list1)
示例代码如下:
list1 = ['Google', 'CSDN', 'tencent', 1997, 1999, 1998]
list2 = [4, 5, 6]
list3 = list1+list2
示例代码如下:
list1 = ['Google', 'CSDN', 'tencent', 1997, 1999, 1998]
list2 = [4, 5, 6]
list3 = list1*2
list4 = list2*3
示例代码如下:
list1 = ['Google', 'CSDN', 'tencent', 1997, 1999, 1998]
bool1 = 'CSDN' in list1
bool2 = 'zhihu' in list1
列表嵌套,本质上指列表也可以作为列表的元素。
示例代码如下:
list1 = [['Google', 'CSDN', 'tencent'], [1997, 1999, 1998]]
a1 = list1[0][1]
b1 = list1[1][2]
a1 = list1[0][1]
b1 = list1[1][2]
不能像ndarray对象那样写成下面这样:
a1 = list1[0, 1]
b1 = list1[1, 2]
此时会报错:
ndarray的多维矩阵元素访问详情见下面这篇博文:
https://blog.csdn.net/wenhao_ir/article/details/124419922
示例代码如下:
import operator
a = [1, 2]
b = [2, 3]
c = [2, 3]
bool1 = operator.eq(a, b)
bool2 = operator.eq(c, b)
示例代码如下:
list1 = [123, 'Google', 'CSDN', 'Taobao', 123]
count1 = list1.count(123)
count2 = list1.count('CSDN')
方法index()语法如下:
list.index(x[, start[, end]])
x-- 查找的对象。
start-- 可选,查找的起始位置。
end-- 可选,查找的结束位置。
示例代码如下:
list1 = ['Google', 'CSDN', 'Taobao', 1997, 1999, 1998, 1999]
index1 = list1.index('CSDN')
index2 = list1.index(1999)
运行结果如下:
列表中1999有两个,可见其返回的是第一个的索引。
示例代码如下:
list1 = [1, 2, 3, 4, 5, 6, 7]
list1.reverse()
方法sort()的语法如下:
list.sort( key=None, reverse=False)
key – 用来进行比较的数值,可选参数。
reverse – 排序规则,reverse = True 降序, reverse = False 升序(默认)。
示例代码如下:
list1 = [1, 5, 3, 9, 7, 4, 2, 8, 6]
list1.sort()
list2 = [1, 5, 3, 9, 7, 4, 2, 8, 6]
list2.sort(reverse=True)
运行结果如下:
关于方法sort()的第一个参数key的用法,就说来话长了,具体情况大家可以参见我的另一篇博文:
https://blog.csdn.net/wenhao_ir/article/details/125406092
示例代码如下:
list1 = ['Google', 'CSDN', 'Taobao', 1997, 1999, 1998, 1999]
list1.clear()
方法copy()的使用示例如下:
list1 = ['Google', 'CSDN', 'Taobao', 1997, 1999, 1998, 1999]
list2 = list1.copy()
list1[0] = 'Facebook'
运行结果如下:
从上面的代码和运行结果我们可以看出,方法copy()作的是深拷贝。
方法copy.append()的使用示例如下:
import copy
list1 = ['Google', 'CSDN', 'Taobao', 1997, 1999, 1998, 1999]
list2 = copy.deepcopy(list1)
list1[0] = 'Facebook'
运行结果如下:
从上面的代码和运行结果我们可以看出,方法copy.append()也是作的是深拷贝。
示例代码如下:
list1 = ['Google', 'CSDN', 'tencent', 1997, 1999, 1998]
list2 = list1
list1[0] = 'Facebook'
运行结果如下:
从上面的运行结果可以看出,对list1的修改影响到了list2,说明二者是共用内存空间,说是“=”实现的是浅拷贝。
示例代码如下:
list1 = ['Google', 'Taobao', 'CSDN', 'Baidu']
tuple1 = tuple(list1)
运行结果如下:
关于元组的详细操作,大家可以参看我的另一篇博文,链接如下:
https://blog.csdn.net/wenhao_ir/article/details/125407815
关于列表如何转换为ndarray对象,请大家参考我的另一篇博文,链接如下:
https://blog.csdn.net/wenhao_ir/article/details/125413801
参考资料:
https://blog.csdn.net/wenhao_ir/article/details/125100220