Как объединить dict of dict в python - PullRequest
0 голосов
/ 03 августа 2020

Два словаря ниже

d1 = {'1': {'index': '1', 'sc': '4', 'st': '3'}, '2': {'index': '2', 'sc': '5', 'st': '5'}}

d2 = {'1': {'diff': 1}, '2': {'diff': 0}}

Код ниже

z = {**d2, **d1} почему это не работает

Также пробовал код ниже

def Merge(d1, d2): 
    return(d2.update(d1))
print(Merge(d1, d2)) 

Ожидайте c ниже

{'1': {'index': '1', 'sc': '4', 'st': '3', 'diff': 1},
 '2': {'index': '2', 'sc': '5', 'st': '5', 'diff': 0}}

Ответы [ 4 ]

3 голосов
/ 03 августа 2020

альтернативный способ, используя pandas

>>> import pandas as pd
>>> df = pd.DataFrame(d1)
>>> df2 = pd.DataFrame(d2)
>>> merged_dict = pd.concat([df,df2]).to_dict()

вывод

>>> merged_dict
{'1': {'index': '1', 'sc': '4', 'st': '3', 'diff': 1}, '2': {'index': '2', 'sc': '5', 'st': '5', 'diff': 0}}
2 голосов
/ 03 августа 2020

z = {** d2, ** d1}

Заменяет все в d2 значениями d1 для ключей '1' и '2'. Сложно объединить словари с одними и теми же ключами, чтобы вы не перезаписывали пары ключ: значение в этих ключах. вывод:

d1['1']['diff'] = d2['1']['diff']
d1['2']['diff'] = d2['2']['diff']

print ('d1:', d1)

Вывод:

d1:  {'1': {'index': '1', 'sc': '4', 'st': '3', 'diff': 1}, '2': {'index': '2', 'sc': '5', 'st': '5', 'diff': 0}}
2 голосов
/ 03 августа 2020

обычно ** захватывает любые аргументы ключевого слова, которые мы передаем функции, в словарь, на который будут ссылаться эти аргументы атрибутов. Например:

d1={'a':1,'b':2}
d2={'c':3,'d':4}

def merge(**di):
    res = {}
    for k, v in di.items():
        try:
            res[k].append(v)
        except KeyError:
            res[k] = [v]
    return res

print(merge(**d1, **d2))
# {'a': [1], 'b': [2], 'c': [3], 'd': [4]}

Однако, если мы передадим два словаря с одинаковыми ключами:

d1 = {'1': {'index': '1', 'sc': '4', 'st': '3'}, '2': {'index': '2', 'sc': '5', 'st': '5'}}
d2 = {'1': {'diff': 1}, '2': {'diff': 0}}

def merge(**di):
    res = {}
    for k, v in di.items():
        try:
            res[k].append(v)
        except KeyError:
            res[k] = [v]
    return res

print(merge(**d1, **d2))
# TypeError: merge() got multiple values for keyword argument '1'

Эта ошибка обрабатывается продолжением, которое сохраняет исходный и пропускает второй ключ dict . Извините, у меня нет сокращенного метода для этого.

d1 = {'1': {'index': '1', 'sc': '4', 'st': '3'}, '2': {'index': '2', 'sc': '5', 'st': '5'}}
d2 = {'1': {'diff': 1}, '2': {'diff': 0}}

def merge(*args):
    res = {}
    for di in args:
        for k, v in di.items():
            try:
                res[k].update(v)
            except KeyError:
                res[k] = v
    return res

print(merge(d1, d2))
# {'1': {'index': '1', 'sc': '4', 'st': '3', 'diff': 1}, '2': {'index': '2', 'sc': '5', 'st': '5', 'diff': 0}}
1 голос
/ 03 августа 2020
>>> for key in d1:
...     d1[key].update(d2[key])

>>> d1
{'1': {'index': '1', 'sc': '4', 'st': '3', 'diff': 1}, '2': {'index': '2', 'sc': '5', 'st': '5', 'diff': 0}}

Обновить :

Если вы хотите использовать другой идентификатор d3.

d3 = d1.copy()
for key in d3:
    d3[key].update(d2[key])

print(d3)

Словари являются изменяемыми объектами. Функция update просто изменяет / обновляет объект и возвращает None. Итак, вам нужно создать копию (чтобы у вас был другой объект) и изменить новый объект, если вы хотите, чтобы исходные данные не изменились.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...