我有两个字典列表,如下所示:
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字典与y字典合并,而忽略重复项?
编辑:
上面的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,以避免重复引用吗?
答案 0 :(得分:2)
我的印象很深刻,第一个字典中的重复元素不是两个不同的元素,而是相同的元素,被引用了两次。尝试使用以下代码合并字典:
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
告诉我它是否可以解决问题=)
答案 1 :(得分:0)
我必须对字典中的键进行假设,但是请尝试以下方法:
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)