Шаг 7.
Python: сборник рецептов. Структуры данных и алгоритмы. Отображение ключей на несколько значений в словаре

    На этом шаге мы рассмотрим способ создания таких словарей.

Задача

    Вы хотите создать словарь, который отображает ключи на более чем одно значение (так называемый "мультисловарь", 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)

    Этот рецепт связан с проблемой группировки записей в задачах обработки данных.

    На следующем шаге мы рассмотрим поддержание порядка в словарях.




Предыдущий шаг Содержание Следующий шаг