根据Python官方文档介绍Python的数据结构知识。
Python中的数据结构有列表(list)、元组(tuples)、序列(sequence)、集合(set)、字典(dictionnary)
本章先介绍一下列表(List),以下是列表提供的一些方法及其描述
list.append(x) | 添加一个元素到列表的末尾,相当于a[len(a):]=[x] |
list.extend(L) | 参数L是一个列表,扩展list,通过添加给定列表的所以元素,相当于a[len(a):]=L |
list.insert(i,x) | 在指定的位置插入一个元素,第一个参数是位置,a.insert(0,x)表示在列表的前面插入 |
list.remove(x) | 移除第一个值为x的元素,如果没有该元素,则报错 |
list.pop([i]) | 移除给定位置的元素,并且返回它。如果没有那个位置,则移除和返回list的最后一个元素。(中括号括起来的参数表明这个是可选项) |
list.clear() | 移除列表中的所有元素 |
list.index(x) | 返回list中值为x的位置。如果没有该值,则报错 |
list.count(x) | 返回列表中x的个数 |
list.sort(key=None,reverse=False | 对列表中的元素进行排序 |
list.reverse() | 反转列表中的元素 |
list.copy() | 进行列表的浅复制 |
下面是一些方法使用的例子
>>> a = [66.25,333,333,1,1234.5]
>>> print(a.count(333),a.count(66.25),a.count('x'))
2 1 0
>>> a.insert(2,-1)
>>> a.append(333)
>>> a
[66.25, 333, -1, 333, 1, 1234.5, 333]
>>> a.index(333)
1
>>> a.remove(333)
>>> a
[66.25, -1, 333, 1, 1234.5, 333]
>>> a.sort()
>>> a
[-1, 1, 66.25, 333, 333, 1234.5]
>>>
1.1把列表当作栈来使用
list提供的一些方法使它很容易当作栈来使用,栈即是最后加入的元素最先取出(“后进先出”)。添加一个元素到栈的顶部使用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]
>>>
1.2
>>>
1.2把列表当作队列使用
也可以把列表当作队列队列使用,队列即是第一个加进来的元素第一个取出(“先进先出”)。然而列表对于这个设想并不是那么有效率。从列表的尾部进行插入和取出操作都很快,但是从列表前面进行插入和取出却很慢(因为后面的元素必须每个都进行移动)。
为了实现队列,使用collections.deque,deque的设计使得它能快速从两端插入和取出。例如:
>>> from collections import deque
>>> queue= deque(["Eric","John","Michael"])
>>> queue.append("Terry")
>>> queue.append("Graham")
>>> queue.popleft()
'Eric'
>>> queue.popleft()
'John'
>>> queue
deque(['Michael', 'Terry', 'Graham'])
>>>
1.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子句中被中括号括起来的表达式,然后0或者更多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)]
>>>
其相当于
>>> coms = []
>>> for x in [1,2,3]:
for y in[3,1,4]:
if x!=y:
coms.append((x,y))
>>> coms
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
>>>
注意在这些代码片中for和if语句的指令是一样的。
如果解析式是一个元组(e.g.(x,y)像之前的例子一样),它必须加上圆括号
>>> vec = [-4,-2,0,2,4]
>>> #创建一个新列表值乘2
>>> [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元元组,如(number,square)
>>> [(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)]
SyntaxError: invalid syntax
>>> #平铺一个列表通过两个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]
>>>
列表解析式可以包含复杂的表达式及嵌套函数
>>> [str(round(pi,i)) for i in range(1,6)]
['3.1', '3.14', '3.142', '3.1416', '3.14159']
>>>
1.4嵌套的列表解析式
在一个列表解析式内的初始化表达式可以是任意的,包括另一个列表解析式。
看看以下一个例子,一个3x4的矩阵实现一个列表包含三个长度为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):
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)]