На этом шаге мы рассмотрим способ создания таких словарей.
Вы хотите создать словарь, который отображает ключи на более чем одно значение (так называемый "мультисловарь", multidict).
Словарь - это отображение, где каждый ключ отображен на единственное значение. Если вы хотите отобразить ключи на множественные значения, вам нужно хранить эти множественные значения в контейнере, таком как список или множество. Например, вы можете создавать такие словари:
d = {
'a': [1, 2, 3],
'b': [4, 5]
}
e = {
'a': {1, 2, 3},
'b': {4, 5}
}
Выбор, использовать либо не использовать списки или множества, зависит от того, как будет использован мультисловарь. Применяйте список, если вы хотите сохранить порядок, в котором добавлены элементы. Применяйте множество, если вы хотите устранить дубликаты (и при этом не беспокоиться о порядке элементов).
Чтобы легко создавать такие словари, вы можете использовать defaultdict из модуля collections. Особенность defautdict заключается в автоматической инициализации первого значения, так что вы можете сосредоточиться на добавлении элементов. Например:
from collections import defaultdict d = defaultdict(list) d['a'].append(1) d['a'].append(2) d['b'].append(4) . . . . d = defaultdict(set) d['a'].add(1) d['a'].add(2) d['b'].add(4) . . . .
Одно предупреждение: defaultdict автоматически создаст записи словаря для ключей, к которым позже будет осуществлен доступ (даже если их в данный момент в словаре нет). Если такое поведение нежелательно, вы можете использовать setdefault() на обычном словаре. Например:
d = {} # Обычный словарь
d.setdefault('a', []).append(1)
d.setdefault('a', []).append(2)
d.setdefault('b', []).append(4)
Однако многие программисты находят setdefault() несколько неестественным - и это если не учитывать тот факт, что он всегда создает новый
экземпляр первоначального значения при каждом вызове (в примере это пустой список []).
Конструирование словарей со множественными значениями не является чем-то сложным. Однако инициализация первого значения может быть запутанной, если вы пытаетесь сделать это самостоятельно. Например, вы можете написать что-то такое:
d = {}
for key, value in pairs:
if key not in d:
d[key] = []
d[key].append(value)
Использование defaultdict приводит к намного более чистому коду:
d = defaultdict(list) for key, value in pairs: d[key].append(value)
Этот рецепт связан с проблемой группировки записей в задачах обработки данных.
На следующем шаге мы рассмотрим поддержание порядка в словарях.