Выбирай структуру под каждую задачу: неизменяемые кортежи, множества для проверки вхождения за O(1), Counter и defaultdict для типовых сценариев.
Открыть этот урок в KodokonВыбор правильной структуры данных одним движением решает и читаемость, и производительность. Кортеж - это неизменяемая последовательность: идеален для разнородной записи фиксированного размера (координаты, пара ключ-значение). Неизменяемость означает хешируемость (если содержимое тоже хешируемо): поэтому кортеж может служить ключом словаря или элементом множества, а список - нет. Распаковка делает код выразительным - а функция, которая «возвращает несколько значений», на самом деле возвращает кортеж.
point = (48.85, 2.35)
lat, lon = point
def min_max(values):
return min(values), max(values)
low, high = min_max([3, 1, 4, 1, 5])
print(low, high)
distances = {("paris", "lyon"): 465}
print(distances[("paris", "lyon")])Множество гарантирует уникальность и даёт проверку вхождения за O(1) в среднем, тогда как у списка это O(n). В цикле, который тысячи раз проверяет x in collection, разница видна сразу. Операторы множеств (& пересечение, - разность, | объединение) - настоящий шаг вперёд по сравнению с вложенными циклами: сравнить два списка идентификаторов - кто исчез, кто новый - умещается в две строки.
active = {"ada", "linus", "guido"}
banned = {"linus", "mallory"}
print(active & banned)
print(active - banned)
print(active | banned)
emails = ["a@x.io", "b@x.io", "a@x.io"]
unique = set(emails)
print(len(unique))Модуль collections закрывает две повседневные потребности. Counter считает вхождения в итерируемом объекте и даёт most_common(n) - больше никаких самописных словарей-счётчиков. defaultdict(factory) создаёт недостающее значение на лету: defaultdict(list) - канонический инструмент для группировки элементов по ключу без проверки существования ключа на каждом проходе цикла.
from collections import Counter, defaultdict
words = ["go", "py", "go", "rs", "go"]
counts = Counter(words)
print(counts.most_common(2))
groups = defaultdict(list)
pairs = [("fr", "Ada"), ("us", "Lin"), ("fr", "Zoe")]
for country, name in pairs:
groups[country].append(name)
print(dict(groups))