Ответ 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
Я новичок в Python. Я не только изучаю его функции, типы и т.д., Но также я пытаюсь изучить питонические способы делать вещи и, следовательно, мой вопрос:
У меня есть пустой словарь. Имя: dict_x
Он должен иметь ключи, значения которых являются списками.
На отдельной итерации я получаю ключ (ex: key_123
) и элемент (кортеж), который нужно поместить в список dict_x
значение key_123
.
Если этот ключ уже существует, я хочу добавить этот элемент. Если этот ключ не существует, я хочу создать его с пустым списком, а затем добавить к нему или просто создать его с кортежем в нем.
В будущем, когда снова появится этот ключ, поскольку он существует, я хочу, чтобы значение было добавлено снова.
Мой код состоит из этого:
Получить ключ и значение.
Посмотрите, существует ли < не ключ < <20 > .
и если не создать его:
dict_x[key] == []
Затем:
dict_x[key].append(value)
Это способ сделать это? Должен ли я использовать блоки try/except
?
Используйте 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
Вот несколько способов сделать это, чтобы вы могли сравнить, как это выглядит и выбрать то, что вам нравится. Я приказал им таким образом, который, по моему мнению, наиболее "питонический", и прокомментировал плюсы и минусы, которые могут быть не очевидны с первого взгляда:
Использование 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]
Вы можете использовать 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)
Для этого вы можете использовать defaultdict.
d = defaultdict(list)
d['key'].append('mykey')
Это немного более эффективно, чем setdefault
, так как вы не создаете новые списки, которые вы не используете. Каждый вызов setdefault
собирается создать новый список, даже если элемент уже существует в словаре.