你真的了解Python中列表的用法吗

深入列表对象

List 数据类型包含更多的方法,下面是 List 对象包含的所有方法:

list.append(*x*)

将一个元素添加到列表的末端。相当于 a[len(a):] = [x]。

list.extend(*iterable*)

将一个 iterable 的对象中的所有元素添加到列表末端来拓展这个列表。相当于 a[len(a):] =iterable。

list.insert(*i*, *x*)

在列表中给定的位置插入一个元素。第一个是要插入的元素的位置。所以 a.insert(0, x) 将元素插入列表最前面,a.insert(len(a), x) 相当于 a.append(x)。

list.remove(*x*)

移除列表中第一个值为 x 的元素。如果没有找到这样的元素,抛出 ValueError。

list.pop([*i*])

移除并返回列表中给定位置的元素。如果没有指定索引,a.pop() 移除并返回列表的最后一个元素。(i 外的方括号表示这个参数是可选的,而不是要求你在这个位置输入方括号。你会经常在 Python Library Reference 中看到这种标记方式)。

list.clear()

移除列表中所有的元素。相当于 del a[:]。

list.index(*x*[, *start*[, *end*]])

返回值为 x 的元素在列表中第一次出现的索引,索引从 0 开始。如果不存在这样的元素,抛出  ValueError。

可选参数 start 和 end 被解释为切片表示法,用于将搜索范围限制在该列表的一个子序列内。返回的索引是该元素在相对于原列表的开端的位置而不是相对于 start 参数的位置。

list.count(*x*)

返回列表中值为 x 的元素的数量。

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 中所有可变数据结构的设计理念。

使用列表作为堆栈

列表的方法使得可以把列表当成元素后进先出的堆栈来用。使用 append() 来把一个元素加到堆栈的顶部。使用不显示携带索引参数的 pop() 方法来把一个元素从堆栈顶部移除。比如:

>>> 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]

使用列表作为队列

也可以使用列表作为队列,其中添加的第一个元素是检索的第一个元素(“先入,先出”);然而,列表对于这一目的并不高效。虽然从列表末尾追加和弹出是高效的,但是从列表的开头开始插入或弹出就低效了(因为所有其他元素都必须移动一个位置)。

实现一个队列,使用 collections.deque 它被设计为从两端都具有快速追加和弹出的能力。例如:

>>> 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'])

列表初始化表达式

列表初始化表达式为创建列表提供了一个简单的方法。一个常见的应用就是对于一个序列,将其中的每个元素进行一些操作,产生新的列表,或者是从原序列按照一定条件创建出子列表。

例如,我们可以通过以下方式产生一组平方数。

>>> 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),其中 x 和 y 分别来自两个列表,且 x 与 y 不相等。

>>> [(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)]

嵌套列表

列表初始化时,里面的元素可以是任何类型的表达式,甚至可以是一个列表。

例如,下面的例子用 3 个长度为 4 的列表,表示了一个 3×4 的矩阵:

>>> matrix = [
...     [1, 2, 3, 4],
...     [5, 6, 7, 8],
...     [9, 10, 11, 12],
... ]

del 语句

有一个方法可以根据索引而不是值从列表中删除一个元素: del 语句。 这和 pop() 方法不同,后者会返回一个值。 del 语句也可用于从列表中删除片段或清除整个列表 (先前我们通过将一个空列表赋值给这个片段来达到此目的)。例如:

>>> a = [-1, 1, 66.25, 333, 333, 1234.5]
>>> del a[0]
>>> a
[1, 66.25, 333, 333, 1234.5]
>>> del a[2:4]
>>> a
[1, 66.25, 1234.5]
>>> del a[:]
>>> a
[]

del 也可用于删除整个变量:

>>> del a

如果再次对变量 a 进行引用将引起错误 (至少在对变量 a 再次赋值前)。在后文中我们将发现 del 的其他用途。

来源:PY学习网:原文地址:https://www.py.cn/article.html

hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » 你真的了解Python中列表的用法吗