如何合并两个具有公共密钥但不同的`unique-identifier:list values`的字典(defaultdict)?

时间:2017-03-14 20:18:28

标签: python list dictionary defaultdict dictionary-comprehension

在这个给定的字典defaultdict(dict)类型数据中:

说这是dict1

{726: {'X': [3.5, 3.5, 2.0}, 'Y': [2.0, 0.0, 0.0], 'chr': [2, 2, 2]}, 128: {'X': [0.5, 4.0, 4.0], 'Y': [4.0, 3.5, 3.5], 'chr': [3, 3, 3]}}

dict2

{726: {'sum_X': [8, 0, 2], 'sum_Y': [3, 2, 0]}, 128: {'sum_X': [0.5, 2, 0], 'sum_Y': [5, 3.5, 3]}}

预期输出:

Union_dict =

{726: {'X': [3.5, 3.5, 2.0}, 'Y': [2.0, 0.0, 0.0], 'chr': [2, 2, 2], 'sum_X': [8, 0, 2], 'sum_Y': [3, 2, 0]}, 128: {'X': [0.5, 4.0, 4.0], 'Y': [4.0, 3.5, 3.5], 'chr': [3, 3, 3], 'sum_X': [0.5, 2, 0], 'sum_Y': [5, 3.5, 3]}}

每个词典都有一个unique key(即726,128 ......),可以在两个词典中找到(dict1 and dict2),但不同词典中的每个词都有unique identifier {{1} }}。我想使用唯一键合并这些词典,但也希望保持列表中值的顺序完整且有序

我尝试了几种方法,包括list values解释的How to merge two Python dictionaries in a single expression?中的广泛方法。我尝试使用我所知道的Aaron Hall来修改方法但是它失败了。

我试过了:

  • 1

    dict comprehension
  • 2

    union_dict = {k: [dict1[i] for i in v] for k, v in dict2.items()}
    
  • 3

    union_dict = defaultdict(dict)
    for a,b in dict1.items(), dict2.items():
        union_dict[dict1].append(dict2)
    

另外,你能否全面解释一下这几种方法,并且保持低内存,因为我的词典会很大。

非常感谢!

1 个答案:

答案 0 :(得分:1)

注意:此解决方案将结果返回为dict1

for key, value in dict2.items():
    for subkey, subvalue in value.items():
        dict1[key][subkey] = subvalue

将所有子项追加到dict1。如果存在冲突(匹配的子密钥,dict1将被dict2 覆盖

>>> dict1
{128: {'Y': [4.0, 3.5, 3.5], 'X': [0.5, 4.0, 4.0], 'chr': [3, 3, 3], 'sum_Y': [5, 3.5, 3], 'sum_X': [0.5, 2, 0]}, 
 726: {'Y': [2.0, 0.0, 0.0], 'X': [3.5, 3.5, 2.0], 'chr': [2, 2, 2], 'sum_Y': [3, 2, 0], 'sum_X': [8, 0, 2]}}

如果您想保留dict1,只需使用copy.deepcopy(),然后添加到该新词典。