Создать вложенный словарь с двумя словарями - PullRequest
2 голосов
/ 17 марта 2020

У меня есть вложенный список с именем multi:

[[14, 77766 ,[2, 2]],
 [15, 77766,  [1, 2]],
 [70, 88866, [1, 5]],
 [71, 88866,[2, 5]],
 [72, 88866, [5, 5]],
 [73, 88866, [4, 5]],
 [74, 88866, [3, 5]],
 [79, 99966, [1, 2]],
 [80, 99966, [2, 2]]] 

Мне нужно, чтобы мой вывод был:

{77766:  {14:2 ,15:1} , 88866: {70:1, 71:2, 72:5, 73:4, 74:3}, 99966: {79:1, 80:2}}

Я написал коды, которые привели ниже два словаря. Как мне объединить их для достижения желаемого результата?

a = {77766: [14, 15], 88866: [70, 71, 72, 73, 74], 99966: [79, 80]}
b = {14: 2, 15: 1, 70: 1, 71: 2, 72: 5, 73: 4, 74: 3, 79: 1, 80: 2}

Ответы [ 4 ]

2 голосов
/ 17 марта 2020

Если ваш входной список отсортирован по второму столбцу, вы можете использовать itertools.groupby:

import itertools

multi = [
    [14, 77766, [2, 2]],
    [15, 77766, [1, 2]],
    [70, 88866, [1, 5]],
    [71, 88866, [2, 5]],
    [72, 88866, [5, 5]],
    [73, 88866, [4, 5]],
    [74, 88866, [3, 5]],
    [79, 99966, [1, 2]],
    [80, 99966, [2, 2]],
]

nested = {
    key: {l[0]: l[2][0] for l in lines}
    for key, lines in itertools.groupby(multi, lambda p: p[1])
}

output

{77766: {14: 2, 15: 1},
 88866: {70: 1, 71: 2, 72: 5, 73: 4, 74: 3},
 99966: {79: 1, 80: 2}}
2 голосов
/ 17 марта 2020

Вы можете использовать defaultdict здесь. multi не нужно сортировать.

from collections import defaultdict
out=defaultdict(dict)
for v,k,vs in multi:
    out[k]={**out[k],**{v:vs[0]}}

Вывод

defaultdict(dict,
            {77766: {14: 2, 15: 1},
             88866: {70: 1, 71: 2, 72: 5, 73: 4, 74: 3},
             99966: {79: 1, 80: 2}})

РЕДАКТИРОВАТЬ :

Сортировка внутренних словарей.

out={k:dict(sorted(v.items(),key=lambda x:x[1])) for k,v in out.items()}

Выход:

{77766: {15: 1, 14: 2},
 88866: {70: 1, 71: 2, 74: 3, 73: 4, 72: 5},
 99966: {79: 1, 80: 2}}
1 голос
/ 17 марта 2020

1. Объедините свои словари

a = {77766: [14, 15], 88866: [70, 71, 72, 73, 74], 99966: [79, 80]}
b = {14: 2, 15: 1, 70: 1, 71: 2, 72: 5, 73: 4, 74: 3, 79: 1, 80: 2}

c = {
    k: {
        i: b[i]
        for i in v
    }
    for k, v in a.items()
}
print(c)

вывод:

{77766: {14: 2, 15: 1}, 88866: {70: 1, 71: 2, 72: 5, 73: 4, 74: 3}, 99966: {79: 1, 80: 2}}

2. Построить словарь результатов прямо из оригинального словаря

0 голосов
/ 23 марта 2020

Для этой проблемы defauldict (dict) действительно удобно. Передав dict , вы определяете пустой словарь в качестве значения по умолчанию. Это означает: если вы пытаетесь получить доступ к ключу, который еще не существует, для этого ключа создается пустой словарь.

res = defaultdict(dict)
for inner_key, key, inner_value in multi:
    res[key].update({inner_key: inner_value[0]}) 

Обратите внимание, что вы получаете defaultdict вместо обычного словаря. Если вам нужно позднее для вашего варианта использования, вы можете использовать:

res = {}
for inner_key, key, inner_value in multi:
    if key not in res:
        res[key] = {}
    res[key].update({inner_key: inner_value[0]})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...