Python создание вложенного словаря из списка с повторяющимися клавишами - PullRequest
2 голосов
/ 19 марта 2020

Я пытаюсь преобразовать список в словарь. У меня есть список таких списков, и некоторые из первых значений мини-списков повторяются:

list = [["DDS 500","A",300], ["DDS 500","B",100], ["AGB 850","C",250], ["AGB 850","B",350], ["UNI 100","D",900]]

Первое значение мини-списков будет ключевым. Затем для каждого мини-списка второе и третье значение будет «значением» для этого ключа, а значения также должны быть словарем. В результате итоговый словарь должен выглядеть так:

dict = { "DDS 500":{"A":300,"B":100}, "AGB 850":{"C":250,"B":350}, "UNI 100":{"D":900} }

Ответы [ 3 ]

3 голосов
/ 19 марта 2020

Вы можете использовать collections.defaultdict

from collections import defaultdict

lst= [["DDS 500","A",300], ["DDS 500","B",100], ["AGB 850","C",250], ["AGB 850","B",350], ["UNI 100","D",900]]

out=defaultdict(dict)

for k,ik,iv in lst:
    out[k].update({ik:iv})

Выход:

defaultdict(dict,
            {'DDS 500': {'A': 300, 'B': 100},
             'AGB 850': {'C': 250, 'B': 350},
             'UNI 100': {'D': 900}})
1 голос
/ 20 марта 2020

Вы можете сделать это в два этапа: 1) создать словарь со всеми ключами и и пустой словарь в качестве значения, 2) объединить значения в виде словарей в каждый ключ:

lst = [["DDS 500","A",300], ["DDS 500","B",100], ["AGB 850","C",250], ["AGB 850","B",350], ["UNI 100","D",900]]

d = { k:dict() for k,*_ in lst }
for k,*v in lst: d[k].update(dict([v]))

вывод:

print(d)

# {'DDS 500': {'A': 300, 'B': 100}, 'AGB 850': {'C': 250, 'B': 350}, 'UNI 100': {'D': 900}}
1 голос
/ 19 марта 2020

вы можете использовать dict.setdefault, если вы не хотите импортировать какой-либо модуль:

result = {}

for k1, k2, v in my_list:
    result.setdefault(k1, {})[k2] = v
result

вывод:

{'DDS 500': {'A': 300, 'B': 100},
 'AGB 850': {'C': 250, 'B': 350},
 'UNI 100': {'D': 900}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...