首页 > 解决方案 > 如何更新两个嵌套列表中的字典?

问题描述

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

l1 = [{'v1':'abc', 'v2':20}, {'v1':'bcd', 'v2':30}, {'v1':'egf', 'v2':15}]
l2 = [{'v1':'abc', 'v3':25}, {'v1':'bcd', 'v3':10}]

我需要根据列表中两个字典的匹配来更新l1附加键的字典,最终结果为:v3v1

[{'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 

有没有更多的pythonic方法来解决这个问题?喜欢使用枚举并避免嵌套 for 循环?

标签: python-3.x

解决方案


将列表命名为d1d2会使它们有点混乱。因此,我冒昧地将它们重命名为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}]

# List comp with ** syntax to update the dicts of the first list
l3 = [{**d1, **d2} for d1, d2 in zip(l1, l2)]

print(l3)

这将打印:

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

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


推荐阅读