Вложенный Dictonary не обновляется должным образом - PullRequest
2 голосов
/ 29 сентября 2019

Я пытаюсь создать вложенный словарь, в котором в качестве оставшихся элементов списка используются ключи словаря.Чтобы объяснить это более простым способом:

Требуемый вывод:

payable = { 'A':{'B':0,'C':0},'B':{'A':0,'C':0}....}

Выход:

payable = { 'A':{'B':0,'C':0,'A':0},'B':{'A':0,'C':0,'B':0}....}

Мне не нужна субключа 'A' под главной клавишей 'A' .Как я могу это исправить?

names = ['A', 'B', 'C']  
payable = dict.fromkeys(names, {})  
for mainKey in payable.keys():
    for subKey in names:
        if(mainKey != subKey):
            payable[mainKey][subKey] = 0 
print(payable) 

Ответы [ 3 ]

5 голосов
/ 29 сентября 2019

Когда вы создаете с помощью dict.fromkeys, все ключи выглядят одинаково dict.

Попробуйте создать payable с dict пониманием (другими словами, новые dict для каждогоключ) и работает нормально:

names = ['A','B','C']  
payable= {k:{} for k in names}
for mainKey in payable.keys():
    for subKey in names:
        if(mainKey!=subKey):
            payable[mainKey][subKey]=0 
print(payable) 

Вывод:

{'A': {'B': 0, 'C': 0}, 'B': {'A': 0, 'C': 0}, 'C': {'A': 0, 'B': 0}}
2 голосов
/ 29 сентября 2019

Такое простое толкование слов также будет работать:

>>> names = ['A', 'B', 'C']
>>> {x: dict.fromkeys(names[:i] + names[i+1:], 0) for i, x in enumerate(names)}
{'A': {'B': 0, 'C': 0}, 'B': {'A': 0, 'C': 0}, 'C': {'A': 0, 'B': 0}}

Объяснение:

  • Получить все остальные элементы с нарезкой списка: names[:i] + names[i+1:]
  • инициализировать значения словаря в ноль с помощью dict.fromkeys
  • Использование enumerate для итерации по индексу и элементу names

Кроме того, мы можем использовать разницу между наборами, если нам не важен порядок ключей, как VPfb показывает в комментариях:

>>> names = {'A', 'B', 'C'}
>>> {x: dict.fromkeys(names - {x} , 0) for x in names}
{'B': {'C': 0, 'A': 0}, 'C': {'B': 0, 'A': 0}, 'A': {'B': 0, 'C': 0}}
0 голосов
/ 29 сентября 2019

Вот обходной путь

names = ['A','B','C'] 
payable = dict()
for key in names:
    tmp = dict()
    for sub in names:
        if sub == key:
          tmp[sub] = 0
    payable[key] = tmp
print(payable)
# {'A': {'A': 0}, 'B': {'B': 0}, 'C': {'C': 0}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...