详解列表List
这里是列表对象方法的清单:
- list.append(x)
添加一个元素到列表的末尾。相当于a[len(a):] = [x]。
- list.extend(L)
将给定列表L中的所有元素附加到原列表a的末尾。相当于a[len(a):] = L。
- list.insert(i, x)
在给定位置插入一个元素。第一个参数是准备插入到其前面的那个元素的索引,所以 a.insert(0, x) 在列表的最前面插入,a.insert(len(a), x) 相当于a.append(x)。
- list.remove(x)
删除列表中第一个值为 x 的元素。如果没有这样的元素将会报错。
- list.pop([i])
删除列表中给定位置的元素并返回它。如果未指定索引,a.pop() 删除并返回列表中的最后一个元素。(i 两边的方括号表示这个参数是可选的,而不是要你输入方括号。你会在 Python 参考库中经常看到这种表示法)。
- list.clear()
删除列表中所有的元素。相当于del a[:]。
- list.index(x)
返回列表中第一个值为 x 的元素的索引。如果没有这样的元素将会报错。
- list.count(x)
返回列表中 x 出现的次数。
- list.sort(cmp=None, key=None, reverse=False)
原地排序列表中的元素。
- list.reverse()
原地反转列表中的元素。
- list.copy()
返回列表的一个浅拷贝,等同于a[:],注意是“浅拷贝”。
将列表当作队列使用
将列表当作队列使用,此时最先进入的元素第一个取出(FIFO,先进先出)。但是列表用作此目的效率不高,原因是在列表的末尾添加和弹出元素非常快,但是在列表的开头插入或弹出元素却很慢 (因为所有的其他元素必须向后移一位,顺序容器的通病)。
如果要实现一个队列,可以使用 collections.deque,它设计的目的就是在两端都能够快速添加和弹出元素。例如:
1 >>> from collections import deque 2 >>> queue = deque(["Eric", "John", "Michael"]) 3 >>> queue.append("Terry") # 加入一个试试 4 >>> queue.append("Graham") # 再加一个 5 >>> queue.popleft() # 删除队头 6 ‘Eric‘ 7 >>> queue.popleft() # 再删队头 8 ‘John‘ 9 >>> queue # 看看剩多少个(剩下后3个) 10 deque([‘Michael‘, ‘Terry‘, ‘Graham‘])
列表解析
列表解析提供了一个生成列表的简洁方法。应用程序通常会从一个序列的每个元素的操作结果生成新的列表,或者生成满足特定条件的元素的子序列。
例如,假设我们想要创建一个列表 s:
1 s=[] 2 for x in range(10): 3 s.append(x**2) 4 print(x) 5 print(s) 6 ---下面是打印--- 7 9 8 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
注意这个for循环中的被创建(或被重写)的名为x的变量在循环完毕后依然存在。使用如下方法,我们可以计算s的值而不会产生任何的副作用:
s = list(map(lambda x: x**2, range(10)))
或者:
s = [x**2 for x in range(10)]
列表解析由括号[]括起来,括号里面包含一个表达式,表达式后面跟着一个for语句,后面还可以接零个或更多的 for 或 if 语句。结果是一个新的列表,由表达式依据其后面的 for 和 if 字句上下文计算而来的结果构成。例如,下面的 listcomp 组合两个列表中不相等的元素:
1 >>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y] 2 [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
这与如下代码是等效的:
1 >>> combs = [] 2 >>> for x in [1,2,3]: 3 ... for y in [3,1,4]: 4 ... if x != y: 5 ... combs.append((x, y)) 6 ... 7 >>> combs 8 [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
有个更高级的应用,考虑下面由三个长度为 4 的列表组成的 3x4 矩阵:
1 >>> matrix = [ 2 ... [1, 2, 3, 4], 3 ... [5, 6, 7, 8], 4 ... [9, 10, 11, 12], 5 ... ]
下面的列表解析可以将矩阵进行转置:
1 >>> [ [row[i] for row in matrix] for i in range(4)] 2 [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
它是从最外层开始进行解析的,即上面代码的功能等同于如下代码:
1 >>> transposed = [] 2 >>> for i in range(4): 3 ... transposed.append([row[i] for row in matrix]) 4 ... 5 >>> transposed 6 [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
有个方法可以从列表中按索引来删除元素: del 语句。这不同于有返回值的 pop() 方法。del 语句还可以用于从列表中删除切片或清除整个列表 (我们是将空列表赋值给切片)。例如:
1 >>> a = [-1, 1, 66.25, 333, 333, 1234.5] 2 >>> del a[0] 3 >>> a 4 [1, 66.25, 333, 333, 1234.5] 5 >>> del a[2:4] 6 >>> a 7 [1, 66.25, 1234.5] 8 >>> del a[:] 9 >>> a 10 []
可以看到,del语句其实是直接对list对象进行操作的,而类似sorted等函数是直接返回一个对象拷贝的,所以并不会改变到原来的list。