【问题标题】:Merge two list of dicts in python when some dicts are duplicates当某些字典重复时,在python中合并两个字典列表
【发布时间】:2019-01-05 18:11:32
【问题描述】:

我有两个字典列表如下:

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

我想将每个dict合并到另一个dict中,所以输出如下:

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 中的 dict 是重复的,它会复制 y 中的 dict,这是我不想要的。我希望每个 x dict 与不同的 y dict 合并(即使 x dict 是重复的)。

有没有办法将每个 x dict 与忽略重复的 y dict 合并?

编辑:

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

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

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

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

【问题讨论】:

  • 这不是在 python 中制作字典的方式。它们应该看起来像 {key1: value1, key2: value2}
  • 有效点 - 我将编辑
  • 有多种方法可以合并 dict,但 dict 是内置类型。 stackoverflow.com/questions/38987/…
  • 您的代码有效。
  • 第二个@RafaelC。当我使用您的代码时,(我将您的变量更改为字符串)和z = merge_x_y(x, y) 我得到了预期的输出。值得注意的是z==x,这样以后如果你对x做点什么,就会影响z

标签: python list dictionary merge


【解决方案1】:

我有一个强烈的印象,第一个字典中的重复元素不是两个不同的元素,而是同一个元素,被引用了两次。试试这个代码来合并字典:

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

告诉我它是否有效 =)

【讨论】:

  • 嗨 Lenik,我已经扩展了这个问题。谢谢,埃德
  • 当我尝试时,您的建议对所有条目都返回“无”。
  • @ThirstforKnowledge 抱歉,希望更新的答案可以解决问题
【解决方案2】:

我必须对字典中的键做出假设,但试试这个:

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)

【讨论】:

    猜你喜欢
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    相关资源
    最近更新 更多