跳到主要内容

数据结构

列表

列表 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)

可以直接用 appendpop 实现栈。

如果需要一个队列,可以用 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

序列的比较

相同的序列类型可以比较大小,规则如下:

  1. 从头开始比较相同位置的元素,直到找到不同的元素
  2. 如果所有元素都相同,则长度较长的序列更大
  3. 碰到不同的元素时,比较元素的大小,较大的元素所在的序列更大

对于字符串类型,使用 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)

参考

数据结构 - python.org