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

标签 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]}}

每个字典都有一个唯一键(即 726、128...),并且在两个字典(dict1 和 dict2)中都可以找到,但不同字典中的每个键都有带有列表值唯一标识符。我想使用唯一键合并这些字典,但也希望保持列表内值的顺序完整且有序

我尝试了多种方法,包括 How to merge two dictionaries in a single expression? 中的扩展方法由Aaron Hall解释。我尝试使用我对字典理解的了解来修改方法,但失败了。

我尝试过:

  • 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)
    

另外,您能否给我一个全面的解释,说明几种实现此目的的方法,并保持较低的内存占用,因为我的字典会很大。

非常感谢!

最佳答案

注意:此解决方案返回的结果为 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()然后添加到新字典中。

关于python - 如何合并两个具有共同键但不同 `unique-identifier: list values` 的字典(defaultdict)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42795756/

相关文章:

python - 如何将二维列表写入文件

android - 如何从 Activity 中一一显示通知警报列表?

c# - 为什么我不能在 C# 中创建匿名类型的列表<T>?

c++ - 使用 for_each 或 transform 访问 map 的第二个元素

python - 如何避免在类里面使用 self.__dict__

python - pandas groupby 并聚合到原始数据帧中

java - 如何用Python、C或Java读取大数据文件的一部分?

python - 如何将字典列表转换为字典

python - Pycharm调试器无法启动: finished with exit code -1073741819 (0xC0000005)

python - Python 2.7 的 Jupyter 安装失败