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.

.
Вернуться на верх