我有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]}
知道我应该如何解决这个问题吗?
答案 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
如果你想要转换回列表的字典
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]}