更新一个字典列表,使其与另一个字典列表一致 - Python

3
list1 = [
    {"code": 1, "a": 7, "b": 9, "c": 24},
    {"code": 2, "a": 78, "b": 12, "c": 45},
    {"code": 3, "a": 3, "b": 5, "c": 16}
]
list2=[
    {"code": 1, "a": 45, "b": 21, "c": 24},
    {"code": 2, "a": 84, "b": 7, "c": 55}
]

输出:

list1 = [
    {"code": 1, "a": 45, "b": 21, "c": 24},
    {"code": 2, "a": 84, "b": 7, "c": 55},
    {"code": 3, "a": 3, "b": 5, "c": 16}
]

我需要根据相同的键名"code",用list2更新list1。 我尝试过:
update_mapping = {k["code"]: k for k in list2}
list1 = [update_mapping.get(k["code"], k) for k in list1]

但是它没有起作用。


1
“但这样做不起作用”并不构成一个有效的问题陈述。 - Mad Physicist
你能使用不同的数据结构吗? - Mad Physicist
1
k["Case"] 看起来是一个非常明显的打字错误。 - Mad Physicist
1
也许它们不应该是列表。codedict1 = {1: {'a': 7, 'b': 9, 'c': 24}, 2: {'a': 78, 'b': 12, 'c': 45}, 3: {'a': 3, 'b': 5, 'c': 16}}codedict2 = {1: {'a': 45, 'b': 21, 'c': 24}, 2: {'a': 84, 'b': 7, 'c': 55}} 更容易处理。 - Joffan
@Joffan 的字典嵌套字典的想法很好。我会尝试并告诉你发生了什么。 - Andrew Tran
2个回答

2

像任何查找问题一样,字典是您的好帮手。将列表转换为以代码为键的形式:

d1 = {d['code']: d for d in list1}
d2 = {d['code']: d for d in list2}
d1.update(d2)
list1 = list(d1.values())

在Python 3.6+中,字典是有序的,并且update函数会保留键的顺序,因此这可以完美地运行。对于早期版本,请使用collections.OrderedDict(在Python 3.6+中仍可用):

from collections import OrderedDict

d1 = OrderedDict((d['code'], d) for d in list1)
d2 = OrderedDict((d['code'], d) for d in list2)
d1.update(d2)
list1 = list(d1.values())

1
假设您的列表顺序正确,另一种解决方案是简单地迭代列表1中的每个项目,并使用列表2中相应的项目进行更新:
for item_1, item_2 in zip(list1, list2):
    item_1.update(item_2)

请记住“Mad”在Python 3.6及以上版本中字典插入顺序的观点。

任何缺失的元素都会使您的方法无效。 - Mad Physicist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接