Python Collections 模块

collections 模块提供了 Counterdefaultdictdeque 等专用容器数据类型。

from collections import Counter, defaultdict, deque

当普通的 listdict 也能完成任务,但代码会显得别扭或更慢时,就可以使用这些类。

Counter

Counter 用来统计可哈希对象的出现次数。

from collections import Counter

letters = Counter('banana')
print(letters)
print(letters['a'])
Counter({'a': 3, 'n': 2, 'b': 1})
3

你也可以直接获取最常见的值:

from collections import Counter

words = ['python', 'java', 'python', 'go', 'python', 'go']
counts = Counter(words)
print(counts.most_common(2))
[('python', 3), ('go', 2)]

defaultdict

defaultdict 会自动创建缺失的键。

from collections import defaultdict

scores = defaultdict(list)
scores['python'].append(10)
scores['python'].append(9)
print(scores['python'])
print(scores['javascript'])
[10, 9]
[]

这在分组数据时非常有用:

from collections import defaultdict

users = [('Ada', 'admin'), ('Grace', 'editor'), ('Linus', 'admin')]
by_role = defaultdict(list)

for name, role in users:
    by_role[role].append(name)

print(dict(by_role))
{'admin': ['Ada', 'Linus'], 'editor': ['Grace']}

deque

deque 在两端追加和弹出元素时都很高效。

from collections import deque

tasks = deque(['build', 'test'])
tasks.appendleft('lint')
tasks.append('deploy')
print(tasks.popleft())
print(tasks.pop())
print(tasks)
lint
deploy
deque(['build', 'test'])

deque 还可以通过 maxlen 只保留最新的值:

from collections import deque

recent = deque(maxlen=3)
for page in ['home', 'docs', 'blog', 'contact']:
    recent.append(page)

print(recent)
deque(['docs', 'blog', 'contact'], maxlen=3)

相关链接