如何合并两个具有公共键但不同`unique-identifier: list values`的字典(defaultdict)?
How to merge two dictionaries (defaultdict) that have common keys but different `unique-identifier: list values`?
在这个给定的字典中 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
和 list values
。我想使用唯一键合并这些字典,但也想保持列表中值的顺序完整且有序。
我尝试了几种方法,包括 How to merge two dictionaries in a single expression? 中由 Aaron Hall
解释的广泛方法。我尝试使用我对 dict comprehension
的了解来修改这些方法,但它失败了。
我试过了:
1
union_dict = {k: [dict1[i] for i in v] for k, v in dict2.items()}
2
union_dict = defaultdict(dict)
for a,b in dict1.items(), dict2.items():
union_dict[dict1].append(dict2)
3
dicts = [dict1, dict2]
union_dict = defaultdict(dict)
for a,b in dicts:
union_dict[k] = tuple(union_dict[k] for d in dicts)
另外,你能不能给我一个全面的解释,说明几种方法,保持低内存占用,因为我的词典会很大。
非常感谢!
注:此解returns结果为dict1
:
for key, value in dict2.items():
for subkey, subvalue in value.items():
dict1[key][subkey] = subvalue
通过将所有子项附加到 dict1
。如果存在冲突(匹配子项,dict1
s 将被 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() 然后添加到那个新字典。
在这个给定的字典中 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
和 list values
。我想使用唯一键合并这些字典,但也想保持列表中值的顺序完整且有序。
我尝试了几种方法,包括 How to merge two dictionaries in a single expression? 中由 Aaron Hall
解释的广泛方法。我尝试使用我对 dict comprehension
的了解来修改这些方法,但它失败了。
我试过了:
1
union_dict = {k: [dict1[i] for i in v] for k, v in dict2.items()}
2
union_dict = defaultdict(dict) for a,b in dict1.items(), dict2.items(): union_dict[dict1].append(dict2)
3
dicts = [dict1, dict2] union_dict = defaultdict(dict) for a,b in dicts: union_dict[k] = tuple(union_dict[k] for d in dicts)
另外,你能不能给我一个全面的解释,说明几种方法,保持低内存占用,因为我的词典会很大。
非常感谢!
注:此解returns结果为dict1
:
for key, value in dict2.items():
for subkey, subvalue in value.items():
dict1[key][subkey] = subvalue
通过将所有子项附加到 dict1
。如果存在冲突(匹配子项,dict1
s 将被 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() 然后添加到那个新字典。