繁体   English   中英

当某些字典重复时,在Python中合并两个字典列表

[英]Merge two list of dicts in python when some dicts are duplicates

我有两个字典列表,如下所示:

x=[{'id':1, 'var1':2},
   {'id':1, 'var1':2},
   {'id':2, 'var1':2}]

y=[{'var2':1, 'var3':2},
   {'var2':3, 'var3':3},
   {'var2':4, 'var3':4}]

我想将每个字典合并到另一个字典中,因此输出如下:

z=[{'id':1, 'var1':2, 'var2':1, 'var3':2},
   {'id':1, 'var1':2, 'var2':3, 'var3':3},
   {'id':2, 'var1':2, 'var2':4, 'var3':4}]

但是,当我使用以下合并功能时:

def merge_x_and_y(x_data, y_data):
    for x_entry, y_entry in zip(x_data, y_data):
        x_entry.update(y_entry )
    return x_data

我最终得到了:

z=[{'id':1, 'var1':2, 'var2':1, 'var3':2},
   {'id':1, 'var1':2, 'var2':1, 'var3':2},
   {'id':2, 'var1':2, 'var2':2, 'var3':3}]

因此,如果x中的字典是重复的,则它会复制y中的字典,这是我不想要的。 我希望每个x dict与不同的y dict合并(即使x dict是重复的)。

有没有一种方法可以将每个x dict与ay dict合并而忽略重复项?

编辑:

上面的reprex可以用,但是在我的实际代码中我仍然没有得到正确的结果。 我认为这可能与Lenik的建议有关,即相同的元素可能被引用两次。

在合并之前,我尝试使用以下方法扩展数据:

def expand_x(x):
    processed_x_data = []     
    [processed_x_data .extend([entry]*entry['count']) for entry in x]
    return processed_x_data 

完成此步骤后,是否应该为每个条目重新分配唯一的ID,以避免重复引用?

我的印象很深刻,第一个字典中的重复元素不是两个不同的元素,而是两次引用的同一元素。 尝试使用以下代码合并字典:

def merge_x_and_y(x_data, y_data):
    result = [a.copy() for a in x_data]
    [a.update(b) for a, b in zip(result, y_data)]
    return result

并告诉我是否可以解决问题=)

我必须对字典中的键进行假设,但是请尝试以下操作:

id = "id"
var1 = "v1"
var2 = "v2"
var3 = "v3"

x=[{id:1, var1:2},
   {id:1, var1:2},
   {id:2, var1:2}]

y=[{var2:1, var3:2},
   {var2:3, var3:3},
   {var2:4, var3:4}]

z = []
for i in range(len(x)) :
    z.append(dict(**x[i],**y[i]))

for i in z :
    print(i)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM