Python:从多个词典中添加值并合并唯一键

时间:2018-02-15 19:32:03

标签: python python-3.x dictionary merge key-value

我有2个字典,它们共享大约80%的相同键,值是2个元素列表。我需要从包含所有键的三个中创建一个新词典,包括每个词典独有的词,我需要相同键的值来总结。

    dict1 = {'Mike': [10,20], 'John': [12,34], 'Steve': [60,10]}
    dict2 = {'Mike': [15,10], 'John': [18,36]}

新词典应如下所示:

    dict3 = {'Mike': [25,30], 'John': [30,70], 'Steve': [60,10]}

知道我应该如何解决这个问题吗?

5 个答案:

答案 0 :(得分:2)

从两个dicts中获取密钥,迭代并填充dict3,具体取决于both_key中的密钥所属的位置

both_keys = set(list(dict1.keys()) + list(dict2.keys()))
dict3 = {}
for k in both_keys:
    if k in dict1 and k in dict2:
        dict3[k] = [sum(x) for x in zip(dict1[k], dict2[k])]
    elif k in dict1:
        dict3[k] = dict1[k]
    else:
        dict3[k] = dict2[k]

答案 1 :(得分:2)

有很多方法可以做到这一点,但这里有一种最小化查找的方法,如果实际的dicts很大,这可能会有所帮助:

keys_1 = set(dict1.keys())
keys_2 = set(dict2.keys())
all_keys = keys_1 | keys_2
for key in all_keys:
    a,b = 0,0
    if key in keys_1:
        a += dict1[key][0]
        b += dict1[key][1]
    if key in keys_2:
        a += dict2[key][0]
        b += dict2[key][1]
    dict3[key] = [a,b]

答案 2 :(得分:2)

这是我尝试使用任意数量的dicts和任意数量的值进行压缩求和的功能性解决方案。

定义合并条目的方式。在这种情况下,通过对各个组件求和,实现结果:

merge = lambda vs: list(map(sum, zip(*vs)))

然后定义如何合并两个dicts:

def merge_dicts(ds):
    keys = set.union(*map(set, ds))
    return {k: merge(map(lambda d: d.get(k, repeat(0)), ds))
            for k in keys}

在这里,我只是检查所有键的并集,合并每个词典的条目,默认为repeat(0),因此merge()只会为缺失值总计零。

之后,您可以合并这样的词组:

merged = merge_dicts([dict1, dict2])

答案 3 :(得分:1)

我的解决方案使用numpy:

    PROCEDURE markviewimport_interface 
    (
    p_invoice_id number(10), 
    p_filename nvarchar(30)
    )IS

    v_xmloutput CLOB;
    --v_FILENAME VARCHAR2(100) := concat(r_markviewimport.invoice_id,'-',r_markviewimport.vendor_num,'.XML');

BEGIN
SELECT  
            XMLFOREST(
                XMLCONCAT(
                        XMLELEMENT("CREATEDBY",XMLATTRIBUTES('Exported By' AS "header"), 'Magellan IT'),
                        XMLELEMENT("TIMESTAMP",XMLATTRIBUTES('Date' AS "header"), TO_CHAR(SYSDATE,'MM.DD.YYYY')),
                        XMLFOREST(
                            XMLFOREST(
                                XMLFOREST(
                                    'invoice_id' AS "DBFIELD",
                                    'Invoice ID' AS "CAPTION",
                                    r_markviewimport.invoice_id AS "VALUE"
                                ) AS "DATA_ITEM"
                            ) AS "BASICDATA"
                        )        
                    ) AS "DATA_ROOT"
                ) 
FROM             
( 
SELECT DISTINCT inv.invoice_id FROM apps.ap_invoices_all inv WHERE inv.invoice_id = 4796324

) r_markviewimport
  1. 连接所有2个键
  2. 循环并使用numpy add对值进行求和,默认值为numpy数组的零
  3. 如果你想要转换回列表的字典

    import numpy as np
    sum_dict = {}
    for key in set(dict1.keys() + dict2.keys()):
        sum_dict[key] = np.add(dict1.get(key, np.zeros(2)), dict2.get(key, np.zeros(2)))
    

答案 4 :(得分:1)

试试这个:

dict1 = {'Mike': [10,20], 'John': [12,34], 'Steve': [60,10]}
dict2 = {'Mike': [15,10], 'John': [18,36]}

new_dict = {}

for x, y in dict1.items():
if x in dict2.keys():
    new_dict[x] = [a + b for a, b in zip(dict2[x], dict1[x])]
else:
    new_dict[x] = dict1[x]
print(new_dict)

#Output : {'Mike': [25, 30], 'John': [30, 70], 'Steve': [60, 10]}