Python 3.x 如何在两个嵌套列表中更新词典?

Python 3.x 如何在两个嵌套列表中更新词典?,python-3.x,Python 3.x,我在这里有两个嵌套列表: l1=[{'v1':'abc','v2':20},{'v1':'bcd','v2':30},{'v1':'egf','v2':15}] l2=[{'v1':'abc','v3':25},{'v1':'bcd','v3':10}] 我需要根据列表中两个DICT上v1的匹配情况,更新附加键v3的l1DICT,最终结果如下: [{'v1':'abc','v2':20,'v3':25},{'v1':'bcd','v2':30,'v3':10},{'v1':'egf','v2'

我在这里有两个嵌套列表:

l1=[{'v1':'abc','v2':20},{'v1':'bcd','v2':30},{'v1':'egf','v2':15}]
l2=[{'v1':'abc','v3':25},{'v1':'bcd','v3':10}]
我需要根据列表中两个DICT上
v1
的匹配情况,更新附加键
v3
l1
DICT,最终结果如下:

[{'v1':'abc','v2':20,'v3':25},{'v1':'bcd','v2':30,'v3':10},{'v1':'egf','v2':15}]
通过使用嵌套for循环,可以轻松地完成此操作-

    for i in d1:
      for j in d2:
         if d2[j]['v1'] == d1[i]['v1']:
            d1[i]['v3'] = d2[j]['v3']
            break 

有没有其他类似蟒蛇的方法来解决这个问题?像使用enum和避免嵌套for循环一样?

将列表命名为
d1
d2
会让它们有点混乱。因此,我冒昧地将它们重命名为
l1
l2
,并将结果列表重命名为
l3
。您可以将列表理解与字典更新语法结合使用,如下所示:

l1=[{“v1”:“abc”,“v2”:20},{“v1”:“bcd”,“v2”:30}]
l2=[{“v1”:“abc”,“v3”:25},{“v1”:“bcd”,“v3”:10}]
[{“v1”:“abc”,“v2”:20,“v3”:25},{“v1”:“bcd”,“v2”:30,“v3”:10}]
#使用**语法列出comp以更新第一个列表的dict
l3=[{**d1,**d2}表示d1,d2在zip中(l1,l2)]
打印(l3)
这将打印:

[{'v1': 'abc', 'v2': 20, 'v3': 25}, {'v1': 'bcd', 'v2': 30, 'v3': 10}]

注意:正如所指出的,该解决方案有一个警告。它假定列表按照问题陈述中提供的顺序进行排序。

d1
d2
,并且输出是无效的数据结构。这是口述清单吗?是的。更新了它,使其更具pythonic风格,时间复杂度更低。除非我们没有其他方法,否则请避免使用n^2算法。如果未对
l2
列表进行排序,则此操作将失败。尝试在
l2=list(反转(l2))之后运行它,
输出将更改。这是真的。然而,OP没有提供任何关于边缘案例等的额外信息。如果列表已经按照问题中提供的顺序进行了排序,那么这似乎是最简单的方法。实际上,您是对的。为简单起见,向上投票。谢谢@RedowanDelowar,但如果列表l1的长度与列表l2的长度不同,即使已排序,这也不起作用。在我的问题中,我正在更新这个场景