Python: list() в качестве значения по умолчанию для словаря

У меня есть код Python, который выглядит так:

if key in dict:
  dict[key].append(some_value)
else:
  dict[key] = [some_value]

но я полагаю, что должен быть какой-то способ обойти этот оператор if. Я попробовал

dict.setdefault(key, [])
dict[key].append(some_value)

и

dict[key] = dict.get(key, []).append(some_value)

но оба жалуются на "TypeError: unhashable type:" list "". Любые рекомендации? Спасибо!

Ответ 1

Лучший способ - использовать collections.defaultdict с list по умолчанию:

from collections import defaultdict
dct = defaultdict(list)

Затем просто используйте:

dct[key].append(some_value)

и словарь создаст для вас новый список, если ключ еще не отображен. collections.defaultdict является подклассом dict и в противном случае ведет себя как обычный объект dict.

При использовании стандартного dict, dict.setdefault() правильно устанавливает dct[key] для вас по умолчанию, так что версия должна работать нормально. Вы можете связать этот вызов с помощью .append():

>>> dct = {}
>>> dct.setdefault('foo', []).append('bar')  # returns None!
>>> dct
{'foo': ['bar']}

Однако, используя dct[key] = dct.get(...).append(), вы заменяете значение dct[key] на вывод .append(), который равен None.