Python dict как создать ключ или добавить элемент к ключу?

Я новичок в Python. Я не только изучаю его функции, типы и т.д., Но также я пытаюсь изучить питонические способы делать вещи и, следовательно, мой вопрос:

У меня есть пустой словарь. Имя: dict_x Он должен иметь ключи, значения которых являются списками.

На отдельной итерации я получаю ключ (ex: key_123) и элемент (кортеж), который нужно поместить в список dict_x значение key_123.

Если этот ключ уже существует, я хочу добавить этот элемент. Если этот ключ не существует, я хочу создать его с пустым списком, а затем добавить к нему или просто создать его с кортежем в нем.

В будущем, когда снова появится этот ключ, поскольку он существует, я хочу, чтобы значение было добавлено снова.

Мой код состоит из этого:

Получить ключ и значение.

Посмотрите, существует ли < не ключ < <20 > .

и если не создать его: dict_x[key] == []

Затем: dict_x[key].append(value)

Это способ сделать это? Должен ли я использовать блоки try/except?

Ответ 1

Используйте dict.setdefault():

dic.setdefault(key,[]).append(value)

помощь (dict.setdefault)

    setdefault(...)
        D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D

Ответ 2

Вот несколько способов сделать это, чтобы вы могли сравнить, как это выглядит и выбрать то, что вам нравится. Я приказал им таким образом, который, по моему мнению, наиболее "питонический", и прокомментировал плюсы и минусы, которые могут быть не очевидны с первого взгляда:

Использование collections.defaultdict:

import collections
dict_x = collections.defaultdict(list)

...

dict_x[key].append(value)

Плюсы: Наверное, лучшая производительность. Минусы: недоступно в Python 2.4.x.

Использование dict().setdefault():

dict_x = {}

...

dict_x.setdefault(key, []).append(value)

Минусы: Неэффективное создание неиспользуемых list() s.

Использование try ... except:

dict_x = {}

...

try:
    values = dict_x[key]
except KeyError:
    values = dict_x[key] = []
values.append(value)

Или:

try:
    dict_x[key].append(value)
except KeyError:
    dict_x[key] = [value]

Ответ 3

Вы можете использовать defaultdict в collections.

Пример из документа doc:

s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
d = defaultdict(list)
for k, v in s:
    d[k].append(v)

Ответ 4

Для этого вы можете использовать defaultdict.

d = defaultdict(list)
d['key'].append('mykey')

Это немного более эффективно, чем setdefault, так как вы не создаете новые списки, которые вы не используете. Каждый вызов setdefault собирается создать новый список, даже если элемент уже существует в словаре.