找回密码
 立即注册
搜索
到手67.99元!阿里云轻量2核2G云服务器
查看: 18|回复: 0

列表

[复制链接]

696

主题

0

回帖

11

积分

管理员

积分
11
发表于 2026-4-20 09:23:17 | 显示全部楼层 |阅读模式
列表 数据类型具有更多的方法。 下面是列表对象的所有方法:

list.append(value, /)
在列表末尾添加一项。 类似于 a[len(a):] = [x]。

list.extend(iterable, /)
通过添加来自 iterable 的所有项来扩展列表。 类似于 a[len(a):] = iterable。

list.insert(index, value, /)
在指定位置插入元素。第一个参数是插入元素的索引,因此,a.insert(0, x) 在列表开头插入元素, a.insert(len(a), x) 等同于 a.append(x) 。

list.remove(value, /)
从列表中移除第一个值为 value 的条目。 如果无此条目则会引发 ValueError。

list.pop(index=-1, /)
移除列表中给定位置上的条目,并返回该条目。 如果未指定索引号,则 a.pop() 将移除并返回列表中的最后一个条目。 如果列表为空或索引号在列表索引范围之外则会引发 IndexError。

list.clear()
移除列表中的所有项。 类似于 del a[:]。

list.index(value[, start[, stop]])
返回列表中 value 首次出现所在的从零开始的索引。 如无此条目则会引发 ValueError。

可选参数 start 和 end 是切片符号,用于将搜索限制为列表的特定子序列。返回的索引是相对于整个序列的开始计算的,而不是 start 参数。

list.count(value, /)
返回列表中 value 出现的次数。

list.sort(*, key=None, reverse=False)
就地排序列表中的元素(要了解自定义排序参数,详见 sorted())。

list.reverse()
翻转列表中的元素。

list.copy()
返回列表的浅拷贝。 类似于 a[:]。

多数列表方法示例:

fruits = ['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana']
fruits.count('apple')
2
fruits.count('tangerine')
0
fruits.index('banana')
3
fruits.index('banana', 4)  # 从 4 号位开始查找下一个 banana
6
fruits.reverse()
fruits
['banana', 'apple', 'kiwi', 'banana', 'pear', 'apple', 'orange']
fruits.append('grape')
fruits
['banana', 'apple', 'kiwi', 'banana', 'pear', 'apple', 'orange', 'grape']
fruits.sort()
fruits
['apple', 'apple', 'banana', 'banana', 'grape', 'kiwi', 'orange', 'pear']
fruits.pop()
'pear'
你可能已经注意到 insert, remove 或 sort 等仅修改列表的方法都不会打印返回值 -- 它们返回默认值 None。 [1] 这是适用于 Python 中所有可变数据结构的设计原则。

你可能会注意到的另一件事是并非所有数据都可以排序或比较。 举例来说,[None, 'hello', 10] 就不可排序因为整数不能与字符串比较而 None 不能与其他类型比较。 此外,还存在一些没有定义顺序关系的类型。 例如,3+4j < 5+7j 就不是一个合法的比较。

1. 用列表实现堆栈
列表方法使得将列表作为栈来使用非常容易,最后添加的元素会最先被取出(“后进先出”)。 要将一个条目添加到栈顶,可使用 append()。 要从栈顶取出一个条目,则使用 pop() 而不必显式指定索引。 例如:

Copy
stack = [3, 4, 5]
stack.append(6)
stack.append(7)
stack
[3, 4, 5, 6, 7]
stack.pop()
7
stack
[3, 4, 5, 6]
stack.pop()
6
stack.pop()
5
stack
[3, 4]

2. 用列表实现队列
列表也可以用作队列,最先加入的元素,最先取出(“先进先出”);然而,列表作为队列的效率很低。因为,在列表末尾添加和删除元素非常快,但在列表开头插入或移除元素却很慢(因为所有其他元素都必须移动一位)。

实现队列最好用 collections.deque,可以快速从两端添加或删除元素。例如:

Copy
from collections import deque
queue = deque(["Eric", "John", "Michael"])
queue.append("Terry")           # Terry 到了
queue.append("Graham")          # Graham 到了
queue.popleft()                 # 第一个到的现在走了
'Eric'
queue.popleft()                 # 第二个到的现在走了
'John'
queue                           # 按到达顺序排列的剩余队列
deque(['Michael', 'Terry', 'Graham'])

3. 列表推导式
列表推导式创建列表的方式更简洁。常见的用法为,对序列或可迭代对象中的每个元素应用某种操作,用生成的结果创建新的列表;或用满足特定条件的元素创建子序列。

例如,创建平方值的列表:

squares = []
for x in range(10):
    squares.append(x**2)

squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
注意,这段代码创建(或覆盖)变量 x,该变量在循环结束后仍然存在。下述方法可以无副作用地计算平方列表:

squares = list(map(lambda x: x**2, range(10)))
或等价于:

squares = [x**2 for x in range(10)]
上面这种写法更简洁、易读。

列表推导式的方括号内包含以下内容:一个表达式,后面为一个 for 子句,然后,是零个或多个 for 或 if 子句。结果是由表达式依据 for 和 if 子句求值计算而得出一个新列表。 举例来说,以下列表推导式将两个列表中不相等的元素组合起来:

[(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
等价于:

combs = []
for x in [1,2,3]:
    for y in [3,1,4]:
        if x != y:
            combs.append((x, y))

combs
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
注意,上面两段代码中,for 和 if 的顺序相同。

表达式是元组(例如上例的 (x, y))时,必须加上括号:

vec = [-4, -2, 0, 2, 4]
# 新建一个将值翻倍的列表
[x*2 for x in vec]
[-8, -4, 0, 4, 8]
# 过滤列表以排除负数
[x for x in vec if x >= 0]
[0, 2, 4]
# 对所有元素应用一个函数
[abs(x) for x in vec]
[4, 2, 0, 2, 4]
# 在每个元素上调用一个方法
freshfruit = ['  banana', '  loganberry ', 'passion fruit  ']
[weapon.strip() for weapon in freshfruit]
['banana', 'loganberry', 'passion fruit']
# 创建一个包含 (数字, 平方) 2 元组的列表
[(x, x**2) for x in range(6)]
[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]
# 元组必须加圆括号,否则会引发错误
[x, x**2 for x in range(6)]
  File "<stdin>", line 1
    [x, x**2 for x in range(6)]
     ^^^^^^^
SyntaxError: did you forget parentheses around the comprehension target?
# 使用两个 'for' 来展平嵌套的列表
vec = [[1,2,3], [4,5,6], [7,8,9]]
[num for elem in vec for num in elem]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
列表推导式可以使用复杂的表达式和嵌套函数:

from math import pi
[str(round(pi, i)) for i in range(1, 6)]
['3.1', '3.14', '3.142', '3.1416', '3.14159']

4. 嵌套的列表推导式
列表推导式中的初始表达式可以是任何表达式,甚至可以是另一个列表推导式。

下面这个 3x4 矩阵,由 3 个长度为 4 的列表组成:

matrix = [
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12],
]
下面的列表推导式可以转置行列:

[[row[i] for row in matrix] for i in range(4)]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
如我们在之前小节中看到的,内部的列表推导式是在它之后的 for 的上下文中被求值的,所以这个例子等价于:

transposed = []
for i in range(4):
    transposed.append([row[i] for row in matrix])

transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
反过来说,也等价于:

transposed = []
for i in range(4):
    # 以下 3 行实现了嵌套的列表推导式
    transposed_row = []
    for row in matrix:
        transposed_row.append(row[i])
    transposed.append(transposed_row)

transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
实际应用中,最好用内置函数替代复杂的流程语句。此时,zip() 函数更好用:

list(zip(*matrix))
[(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)]
关于本行中星号的详细说明,参见 解包实参列表。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|skypiea

GMT+8, 2026-6-27 05:17 , Processed in 0.043910 second(s), 20 queries .

Powered by skypiea

快速回复 返回顶部 返回列表