Python: динамические ключи во вложенном словаре
я использую оболочку django shell, чтобы попытаться создать такой словарь:
{'SECTION ONE':
{'Category One': [<Price: price element one>],
'Category Two': [<Price: price element one>,
<Price: price element two>]},
'SECTION TWO':
{'Category One': [<Price: price element one>,
<Price: price element two>]}}
но этот кусок кода: dict[section][category] = [x] изменяет "элемент цены один" на "два", как результат ниже.
dict = dict()
for x in price.objects.all():
if section not in dict:
dict[section] = {
category: [x]
}
else:
dict[section][category] = [x]
dict[section][category].append(x)
{'SECTION ONE':
{'Category One': [<Price: price element two>],
'Category Two': [<Price: price element two>,
<Price: price element two>]},
'SECTION TWO':
{'Category One': [<Price: price element two>,
<Price: price element two>]}}
как вы можете сохранить все элементы?
Вы должны построить новый список только в том случае, если категория еще не определена в mydict[section
, поэтому:
mydict = {}
for x in price.objects.all():
if section not in mydict:
mydict[section] = { category: [x] }
elif category not in mydict[section]:
mydict[section][category] = [x]
else:
mydict[section][category].append(x)
Другим вариантом является работа с defaultdict
:
from collections import defaultdict
mydict = defaultdict(lambda: defaultdict(list))
for x in price.objects.all():
mydict[section][category].append(x)
mydict = {k: dict(v) for k, v in mydict.items()}
Примечание: Пожалуйста, не называйте переменную
.dict
, она переопределяет ссылку наdict
встроенную функцию [Python-doc]. Используйте, например,mydict
.