掘金 后端 ( ) • 2024-04-12 20:33

Python 教程 - 列表文章中已经介绍了列表的创建、新增、修改等功能,这篇文章将介绍列表的查询、排序、复制等其他相关操作方法。

常用操作方法

方法 说明 sort()、 sorted() 排序 slice()、reverse() 反转 slice、copy()、list()、deepcopy() 复制 index() 获取元素 offset len() 获取列表长度 count() 计算内容出现次数 join() 拼接内容 in 检查元素是否存在 、==、!=、>、< 比较列表 * 重复元素

sort()、 sorted()

Python 提供了 sort()sorted() 两种列表的函数,函数内包含 keyreverse 参数(可都不填),key 表示进行比较的元素,reverse 不填则使用默认 False,进行升序排序(从小到大),如果参数为 True 进行降序排序(从大到小),如果排序的是字符串,以字母的顺序进行排序。

sort()

sort() 函数使用后,会直接将原本的列表项目进行排序,因此会改变原始的列表。

a = [0,3,2,1,4,9,6,8,7,5]
a.sort()
print(a)   # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
a.sort(reverse=True)
print(a)   # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

sorted()

sorted() 函数使用后,会产生一个排序过后的新列表,因此不会改变原始的列表。

a = [0,3,2,1,4,9,6,8,7,5]
b = sorted(a)
c = sorted(a, reverse=True)
print(a)   # [0, 3, 2, 1, 4, 9, 6, 8, 7, 5]
print(b)   # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(c)   # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

如果列表的内容也是列表,排序时可以通过 key 参数,指定对应的项进行排序,下面的示例使用匿名函数 lambda,针对每个项的第二个子项进行排序(如果没有设置 key 参数,默认都以第一个项进行排序)。

a = [[1,2,3],[9,8,7],[2,4,6],[3,1,9]]
b = sorted(a)
c = sorted(a, key = lambda s: s[1])
print(a)   # [[1, 2, 3], [9, 8, 7], [2, 4, 6], [3, 1, 9]]
print(b)   # [[1, 2, 3], [2, 4, 6], [3, 1, 9], [9, 8, 7]] 使用第一个项目 1,2,3,9 排序
print(c)   # [[3, 1, 9], [1, 2, 3], [2, 4, 6], [9, 8, 7]] 使用第二个项目 1,2,4,8 排序

反转列表

Python 提供了两种反转列表的方法:

slice

使用 slice 反转列表方法不会改变原始列表,会产生一个新的列表,在产生新列表时使用[::-1],就能反转列表内容。

a = [0,1,2,3,4,5]
b = a[::-1]
print(a)   # [0, 1, 2, 3, 4, 5]
print(b)   # [5, 4, 3, 2, 1, 0]

reverse()

使用 reverse() 函数可以反转列表,但反转之后,会改变原始列表。

a = [0,1,2,3,4,5]
a.reverse()
print(a)   # [5, 4, 3, 2, 1, 0]

复制列表

Python 提供四种复制列表的方法:

slice、copy()、list()

slice、copy()、list() 三种方式都可以快速复制一个新的列表。

a = [0,1,2,3,4,5]
b = a[:]
c = a.copy()
d = list(a)
print(a)   # [0, 1, 2, 3, 4, 5]
print(b)   # [0, 1, 2, 3, 4, 5]
print(c)   # [0, 1, 2, 3, 4, 5]
print(d)   # [0, 1, 2, 3, 4, 5]

deepcopy()

上述的三种方式只能针对“元素内容不会发生变化”的列表,如果元素的“深层内容”会发生变化,就会出现奇怪的现象。例如,下面的程序执行后,当 a 改变时理应不应该影响到 b、c、d 这三个新列表,但执行结果却发现 b、c、d 的内容也跟着改变了。

a = [0,1,2,3,4,[100,200]]
b = a[:]
c = a.copy()
d = list(a)
a[-1][0]=999
print(a)   # [0, 1, 2, 3, 4, [999, 200]]
print(b)   # [0, 1, 2, 3, 4, [999, 200]]
print(c)   # [0, 1, 2, 3, 4, [999, 200]]
print(d)   # [0, 1, 2, 3, 4, [999, 200]]

如果要解决这个问题,就必须要 import copy() 模组,使用 deepcopy() 进行深度复制,就能产生一个完全独立的新列表。

import copy
a = [0,1,2,3,4,[100,200]]
b = a[:]
c = a.copy()
d = list(a)
e = copy.deepcopy(a)
a[-1][0]=999
print(a)   # [0, 1, 2, 3, 4, [999, 200]]
print(b)   # [0, 1, 2, 3, 4, [999, 200]]
print(c)   # [0, 1, 2, 3, 4, [999, 200]]
print(d)   # [0, 1, 2, 3, 4, [999, 200]]
print(e)   # [0, 1, 2, 3, 4, [100, 200]]  使用 deepcopy 的没有被改变

index() 取得元素 offset

index() 函数可以取得列表中某个元素的索引(offset),如果有多个同样内容的元素,以第一个找到的为主。

a = ['apple','banana','banana','orange']
print(a.index('banana'))   # 1

len() 取得列表长度

len() 函数可以取得列表的长度 ( 里面有几个元素)。

a = ['apple','banana','banana','orange']
print(len(a))   # 4

count() 计算元素出现次数

count() 函数可以计算列表中,某些元素出现的次数。

a = ['apple','banana','banana','orange']
print(a.count('banana'))   # 2
print(a.count('grap'))     # 0

join() 拼接列表内容

join() 函数可以将一个列表里所有的元素,拼接成一个字符串,使用时可以指定拼接的字符串。

a = ['hello world', 'I am oxxo', 'how are you?']
b = ', '.join(a)  # 使用逗号,进行拼接
print(b)  # hello world, I am oxxo, how are you?

in 检查内容是否存在

通过元素 in 列表的方法,可以检查列表中是否存在某些内容,如果存在则返回 True,不存在则返回 False ( 使用元素 not in 集合可以判断不存在 )。

a = ['apple','banana','banana','orange']
print('orange' in a)    # True
print('melon' in a)     # False

比较列表

使用 ==、!=,可以比较两个列表是否相等,使用 <、<=、>=、>,可以比较列表的长度,注意,列表的比较只能针对相同类型的数据,如果比较数值和字符串的内容,就会发生错误。

a = [1,2,3,4]
b = [1,2,3,4,5]
print(a==b)     # False
print(a>=b)     # False
print(a<b)      # True
print(a!=b)     # True

使用 * 号重复元素

使用*可以重复列表的内容,使其变成一个新的列表。

a = ['apple','banana']
b = a*3
print(a)   # ['apple', 'banana']
print(b)   # ['apple', 'banana', 'apple', 'banana', 'apple', 'banana']