У меня есть пустой словарь. Название:dict_x
это ключи, значения которых являются списками.
Из отдельной итерации я получаю ключ (ex:) key_123
и элемент (кортеж) для помещения в список dict_x
значений key_123
.
Если этот ключ уже существует, я хочу добавить этот элемент. Если этот ключ не существует, я хочу создать его с пустым списком, а затем добавить к нему или просто создать его с кортежем в нем.
В будущем, когда снова появится этот ключ, поскольку он существует, я хочу, чтобы значение было добавлено снова.
Мой код состоит из этого:
Получить ключ и значение.
Смотрите , если НЕ ключ существует в
dict_x
.и если не создать его:
dict_x[key] == []
После этого:
dict_x[key].append(value)
Это способ сделать это? Должен ли я использовать try/except
блоки?
dict_x[key] = [some_value] if not dict_x.has_key(key) else dict_x[key] + [some_value]
но этот ответ предлагает гораздо лучший способ. На самом деле это становитсяset()
аргументом и позволяет вам использоватьadd()
метод ...Вот различные способы сделать это, чтобы вы могли сравнить, как это выглядит и выбрать то, что вам нравится. Я заказал их таким образом, который я считаю наиболее "питоническим" , и прокомментировал плюсы и минусы, которые могут быть не очевидны на первый взгляд:
Использование
collections.defaultdict
:Плюсы: вероятно, лучшая производительность. Минусы: Недоступно в Python 2.4.x.
Использование
dict().setdefault()
:Минусы: неэффективное создание неиспользованных
list()
с.Использование
try ... except
:Или:
источник
.setdefault()
создает ненужные словари. Я думаю, что я создаю ненужныеlist
s (то есть[]
) во втором аргументе,.setdefault()
который никогда не используется, если онkey
уже существует. Я мог бы использоватьdict.setdefault()
(для эффективного хеширования ключей) и использовать переменную для повторного использования неиспользуемыхlist
s, но это добавляет еще несколько строк кода..setdefault
создает обычную,dict
где поиск по отсутствующим ключам приведет к тому, что некотороеKeyError
времяcollections.defaultdict(list)
создастdict
поиск по отсутствующим ключам, которая вставит пустуюlist
- я думаю, вы должны выбрать, основываясь на том, какое поведение вы хотитеВы можете использовать defaultdict для этого.
Это немного эффективнее, чем
setdefault
когда вы не создаете новые списки, которые не используете. Каждый вызовsetdefault
создает новый список, даже если элемент уже существует в словаре.источник
Вы можете использовать defaultdict в
collections
.Пример из документа:
источник
источник
dict.get
).