Если вы хотите иметь списки только тогда, когда они необходимы, и значения в любых других случаях, то вы можете DOthis:
class DictList(dict):
def __setitem__(self, key, value):
try:
# Assumes there is a list on the key
self[key].append(value)
except KeyError: # if fails because there is no key
super(DictList, self).__setitem__(key, value)
except AttributeError: # if fails because it is not a list
super(DictList, self).__setitem__(key, [self[key], value])
Затем вы можете сделать следующее:
dl = DictList()
dl['a'] = 1
dl['b'] = 2
dl['b'] = 3
Что будет хранить следующее {'a': 1, 'b': [2, 3]}
.
Я использую эту реализацию, когда хочу иметь обратные / обратные словари, и в этом случае я просто делаю:
my_dict = {1: 'a', 2: 'b', 3: 'b'}
rev = DictList()
for k, v in my_dict.items():
rev_med[v] = k
Что будет генерировать тот же вывод, что и выше: {'a': 1, 'b': [2, 3]}
.
CAVEAT: Эта реализация основана на несуществующем методе append
(в значениях, которые вы хранятся). Это может привести к непредвиденным результатам, если значения, которые вы храните, являются списками. Например,
dl = DictList()
dl['a'] = 1
dl['b'] = [2]
dl['b'] = 3
выдаст тот же результат, что и раньше {'a': 1, 'b': [2, 3]}
, но можно было ожидать следующее: {'a': 1, 'b': [[2], 3]}
.