数据结构
列表
列表 list
有如下方法:
append(x)
相当于a[len(a):] = [x]
extend(iterable)
相当于a[len(a):] = iterable
copy()
相当于a[:]
clear()
相当于del a[:]
pop([i])
count(x)
insert(i, x)
index(x[, start[, end]])
未找到x
会抛错remove(x)
未找到x
会抛错reverse()
sort(key=None, reverse=False)
可以直接用 append
和 pop
实现栈。
如果需要一个队列,可以用 collections.deque
:
from collections import deque
queue = deque(["apple", "banana", "orange"])
queue.append("pear")
queue.popleft() # => "apple"
列表推导式
可以用列表推导式简化代码,通常形式为 [表达式 for 值 in 列表 if 条件]
。
squares = [x**2 for x in range(5)] # => [0, 1, 4, 9, 16]
[(x, y) for x in [1, 2] for y in [3, 4]]
# => [(1, 3), (1, 4), (2, 3), (2, 4)]
[x for x in range(10) if x % 2 == 0] # => [0, 2, 4, 6, 8]
列表推导式可以嵌套:
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]]
del 语句
del
语句可以删除列表中的元素:
a = [1, 2, 3, 4, 5, 6]
del a[0] # => [2, 3, 4, 5, 6]
del a[2:4] # => [2, 3, 6]
del a[:] # => []
元组
列表、字符串和元组都是序列类型,支持很多相同的操作。
元组由逗号分隔的值组成(通常用圆括号包裹),可以用索引访问:
t = 12345, 54321, 'hello!'
t[0] # => 12345
# 支持解包
x, y, z = t
# 元组可以嵌套
u = t, (1, 2, 3, 4, 5)
元组是不可变的,但是可以包含可变的对象:
v = ([1, 2, 3], [3, 2, 1])
v[0][0] = 0 # => ([0, 2, 3], [3, 2, 1])
v[0] = [1] # => TypeError: 'tuple' object does not support item assignment
集合
使用 set()
或 {}
创建集合(空集合只能用 set()
创建):
basket = {'apple', 'banana', 'orange'}
'orange' in basket # => True
a = set(['apple', 'banana', 'orange']) # => {'apple', 'banana', 'orange'}
b = set('apple') # => {'a', 'p', 'l', 'e'}
可以用 -
&
|
^
操作符计算集合的差集、交集、并集、对称差集:
a = set('apple')
b = set('banana')
a - b # => {'p', 'e', 'l'}
a & b # => {'a'}
a | b # => {'p', 'n', 'e', 'l', 'b', 'a'}
a ^ b # => {'n', 'p', 'b', 'l', 'e'}
集合也支持列表推导式。
字典
字典即键值对的集合,使用 {}
或 dict()
创建:
d = {'apple': 1, 'banana': 2, 'orange': 3}
d['apple'] # => 1
dict([('apple', 1), ('banana', 2), ('orange', 3)])
# => {'apple': 1, 'banana': 2, 'orange': 3}
# 也可以直接用关键字参数创建
dict(apple=1, banana=2, orange=3)
键可以是任何不可变类型,通常是字符串或数字。访问不存在的键值会直接报错。可以用 in
检查字典中的键,或者用 del
删除键值对。
使用 list(d)
可以获取字典的键列表,结果会按插入次序排序。
也可以用字典推导式创建字典:
{x: x**2 for x in (2, 4, 6)} # => {2: 4, 4: 16, 6: 36}
循环的技巧
可以用 items()
进行键值对遍历:
d = {'apple': 1, 'banana': 2, 'orange': 3}
for k, v in d.items():
print(f'{k}: {v}')
可以用 enumerate()
获取索引:
for i, v in enumerate(['apple', 'banana', 'orange']):
print(f'{i}: {v}')
可以用 zip()
同时遍历多个序列:
questions = ['name', 'quest', 'favorite color']
answers = ['lancelot', 'the holy grail', 'blue']
for q, a in zip(questions, answers):
print(f'What is your {q}? It is {a}.')
其余一些有用的函数:
reversed()
反向遍历序列sorted()
返回排序后的序列set()
去重
深入条件控制
TODO
序列的比较
相同的序列类型可以比较大小,规则如下:
- 从头开始比较相同位置的元素,直到找到不同的元素
- 如果所有元素都相同,则长度较长的序列更大
- 碰到不同的元素时,比较元素的大小,较大的元素所在的序列更大
对于字符串类型,使用 Unicode 码位序号进行比较。
(1, 2, 3) < (1, 2, 4)
[1, 2, 3] < [1, 2, 4]
'abc' < 'abd'
(1, 2, 3) == (1.0, 2.0, 3.0)
(1, 2, ('aa', 'ab')) < (1, 2, ('abc', 'a'), 4)