你真的了解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