Как объединить значения словарей с одинаковым ключом - PullRequest
0 голосов
/ 01 марта 2020

У меня есть словарь, который содержит несколько словарей (номер которых не фиксирован), которые, в свою очередь, содержат списки чисел (число списков каждого под-словаря также не является фиксированным).

Data_Dict ={0:{0:[list 00], 1:[list 01], 2:[list 02], 3:[list 03], ...},
            1:{0:[list 10], 1:[list 11], 2:[list 12], 3:[list 13], ...},
            2:{0:[list 20], 1:[list 21], 2:[list 22], 3:[list 23], ...},
            ...}

Data_Dict - это то, что я получаю при разборе данных из разных файлов, каждый из которых предоставляет информацию о разных объектах.

Ключи словарей взяты из циклов for, которые я использовал для импорта разных файлов или разных объекты (более конкретно, ключи относятся к файлам, когда значения являются словарями, в то время как ключи относятся к одному объекту, когда значения являются строками).

Я пытаюсь объединить списки с указанным ключом c всех под-словарей в одном списке. Важно, чтобы порядок сохранялся, то есть элементы списка Data_Dict [0] [0] должны предшествовать элементам списка Data_Dict [1] [0] и так далее. Здесь у вас есть желаемый результат:

NewData_Dict ={0:[list 00, list 10, list 20,...],
               1:[list 01, list 11, list 21,...],
               2:[list 02, list 12, list 22,...], 
               ...}

Я пытался использовать то, что было предложено в другом вопросе ( Как я могу комбинировать словари с одинаковыми клавишами? ), что :

NewData_Dict = {}
for k in Data_Dict[0]:
    NewData_Dict[k] = [d[k] for d in Data_Dict]

Что мне дает:

NewData_Dict[k] = [d[k] for d in Data_Dict]
TypeError: 'int' object is not subscriptable

Я попробовал также ответить на вопрос Объединить значения одних и тех же ключей в списке диктов :

NewData_Dict = {
    k: [d.get(k) for d in Data_Dict]
    for k in set().union(*Data_Dict)
}

Получение взамен:

NewData_Dict = {k: [d.get(k) for d in Data_Dict] for k in set().union(*Data_Dict)}
TypeError: 'int' object is not iterable

Я думаю, что проблема может заключаться в том, что ключи моих словарей имеют значение int. Правильно ли мое предположение? Как я могу это исправить?

Ответы [ 4 ]

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

Объяснение в комментариях к коду. Попробуйте:

Data_Dict ={0:{0:["A", "B", "C"], 1:["E", "F", "G"], 2:["H", "I", "J"], 3:["K", "L", "M"]},
            1:{0:["N", "O", "P"], 1:["Q", "R", "S"], 2:["T", "U", "V"], 3:["W", "X", "Y"]},
            2:{0:["AA", "BB", "CC"], 1:["DD","EE","FF"], 2:["GG", "HH", "II"], 3:["JJ","KK","LL"]},}

New_Data_Dict = {}
# for each key in Data_Dict
for dict in Data_Dict:
    # for each key in Data_Dict[key]
    for list in Data_Dict[dict]:
        # if list key exists in New_Data_Dict append Data_Dict[dict key][list key] <<== Value of list
        if list in New_Data_Dict:
            New_Data_Dict[list]+=(Data_Dict[dict][list])
        # else create list key and add value
        else:
            New_Data_Dict[list] = Data_Dict[dict][list]

print(New_Data_Dict)

Вывод:

{0: ['A', 'B', 'C', 'N', 'O', 'P', 'AA', 'BB', 'CC'], 
 1: ['E', 'F', 'G', 'Q', 'R', 'S', 'DD', 'EE', 'FF'], 
 2: ['H', 'I', 'J', 'T', 'U', 'V', 'GG', 'HH', 'II'], 
 3: ['K', 'L', 'M', 'W', 'X', 'Y', 'JJ', 'KK', 'LL']}
0 голосов
/ 01 марта 2020

Вы можете перебирать элементы каждого вложенного диктанта.

data = {0: {0: ['00', '00'], 1: ['01', '01'], 2: ['02', '02'], 3: ['03', '03']},
        1: {0: ['10', '10'], 1: ['11', '11'], 2: ['12', '12'], 3: ['13', '13']},
        2: {0: ['20', '20'], 1: ['21', '21'], 2: ['22', '22'], 3: ['23', '23']}}

new = {}
for x in data.values():
    for key in x:
        try:
            new[key].extend(x[key])
        except KeyError:
            new[key] = x[key]

Вывод:

>>> new
{0: ['00', '00', '10', '10', '20', '20'], 
 1: ['01', '01', '11', '11', '21', '21'], 
 2: ['02', '02', '12', '12', '22', '22'], 
 3: ['03', '03', '13', '13', '23', '23']}
0 голосов
/ 01 марта 2020
for i in range(len(Data_dict)):
    for j in range(len(Data_dict[i] - 1):
        Data_dict[i][0].extend(Data_dict[i][j+1]
0 голосов
/ 01 марта 2020

Это л oop может быть полезным

the_new_dic = {}
for key_1 in range(len(the_dict)):
  for key_2 in range(len(the_dict[key_1])):
    the_new_dic[key_1].extend(the_dict[key_2][key_1])

...