Уроки модуля (3/4)
коллекции: Counter и defaultdict
Модуль collections добавляет специализированные типы данных, расширяющие
встроенные коллекции. Три наиболее часто используемых: Counter, defaultdict,
namedtuple.
Counter: подсчет частоты
from collections import Counter
parole = ["mela", "pera", "mela", "kiwi", "mela", "pera"]
c = Counter(parole)
# Counter({'mela': 3, 'pera': 2, 'kiwi': 1})
c["mela"] # 3
c["banana"] # 0 (default for missing keys, NO KeyError)
c.most_common(2) # [('mela', 3), ('pera', 2)]Он также работает со строками (подсчитывает символы):
Counter("ciao mondo")
# Counter({'o': 2, 'c': 1, 'i': 1, 'a': 1, ' ': 1, 'm': 1, 'n': 1, 'd': 1})Он поддерживает операции над числами (+, -, &, |) — очень удобно. для агрегирования данных из разных источников.
defaultdict: dict с автоматическим значением по умолчанию
Словарь, который при доступе к отсутствующему ключу создает его, вызывая завод.
from collections import defaultdict
gruppi = defaultdict(list) # factory = list (empty list)
for nome in ["Ada", "Linus", "Ada", "Grace"]:
gruppi[nome].append(1)
# defaultdict(list, {'Ada': [1, 1], 'Linus': [1], 'Grace': [1]})Без defaultdict вам пришлось бы написать:
gruppi = {}
for nome in [...]:
if nome not in gruppi:
gruppi[nome] = []
gruppi[nome].append(1)Общие фабрики: list, int (по умолчанию 0), set, dict.
namedtuple: кортежи с именами полей
Легкий способ создания неизменяемых классов записей. Это кортеж, но с доступом к полям по имени.
from collections import namedtuple
Punto = namedtuple("Punto", ["x", "y"])
p = Punto(3, 4)
p.x # 3 (access by name)
p[0] # 3 (access by index, still a tuple)
p.x + p.y # 7
# typical use: return multiple values from a function
def divisione(a, b):
Risultato = namedtuple("Risultato", ["quoziente", "resto"])
return Risultato(a // b, a % b)
r = divisione(17, 5)
r.quoziente # 3
r.resto # 2(Для более сложных случаев существует также dataclasses, начиная с версии 3.7 — см. M9.)
Nametuple: облегченные неизменяемые записи
Модуль collections также экспортирует namedtuple, который позволяет быстро создавать облегченные классоподобные объекты для хранения структурированных данных без написания конструкторов или шаблонных методов:
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(10, 20)
print(p.x, p.y)Попробуйте это
Учитывая список `words = ['mela', 'pera', 'mela', 'kiwi', 'mela', 'pera']`, вычислите наиболее часто встречающееся слово в `top` в виде строки. Оцените «верх».
Показать подсказку
Counter(...).most_common(1) возвращает [(слово, количество)].
Решение доступно после 3 попыток
Обзор упражнения
Учитывая количество учащихся = [('Ada', 'mate'), ('Linus', 'fisica'), ('Ada', 'storia'), ('Grace', 'mate')]`, создайте `courses_per_student` как defaultdict(list). Оцените `dict(courses_per_student)`.
Показать подсказку
defaultdict(list), затем для s, c в зачислениях.
Решение доступно после 3 попыток
Дополнительная задача
Импортируйте «Счетчик» из «коллекций». Посчитайте частоту символов в строке \`text = "abracadabra"\`. Сохраните счетчик в \`char_counter\` и оцените его.
Показать подсказку
Counter принимает строку в качестве параметра и подсчитывает вхождения каждой буквы.
Решение доступно после 3 попыток