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

时间:2018-07-29 06:46:10

标签: python list dictionary merge

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

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,以避免重复引用吗?

2 个答案:

答案 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)