使用公共 id 键合并两个字典列表

Merging two lists of dictionaries using common id key

我有以下两个词典列表:

list_1 = [
   {'id': '1', 'name': 'Johnny Johson1'},
   {'id': '2', 'name': 'Johnny Johson2'},
   {'id': '1', 'name': 'Johnny Johson1'},
   {'id': '3', 'name': 'Johnny Johson3'},
]
list_2 = [
   {'id': '1', 'datetime': '2020-01-06T12:30:00.000Z'},
   {'id': '2', 'datetime': '2020-01-06T14:00:00.000Z'},
   {'id': '1', 'datetime': '2020-01-06T15:30:00.000Z'},
   {'id': '3', 'datetime': '2020-01-06T15:30:00.000Z'},
]

基本上,我希望即使重复 ID 也不会丢失数据,因为它们代表不同的事件(为此有一个单独的 ID,但出于演示问题的目的,不需要)。如果一个列表中有任何 ID,而另一个列表中没有,则完全忽略该 ID。

理想情况下,我希望得到以下结果(来自两个列表的合并):

list_3 = [
   {'id': '1', 'name': 'Johnny Johson1', 'datetime': '2020-01-06T12:30:00.000Z'},
   {'id': '2', 'name': 'Johnny Johson2', 'datetime': '2020-01-06T14:00:00.000Z'},
   {'id': '1', 'name': 'Johnny Johson1', 'datetime': '2020-01-06T15:30:00.000Z'},
   {'id': '3', 'name': 'Johnny Johson3', 'datetime': '2020-01-06T15:30:00.000Z'},
]

您可以使用以下列表理解,它使用双星号关键字 argent 解包语法,使用通过 zip() 获得的成对元素在两个列表上进行评估。这样就达到了把两个词典合二为一的效果了。

list_3 = [{**x, **y} for x, y in zip(list_1, list_2)]

输出:

>>> list3
[{'id': '1', 'name': 'Johnny Johson1', 'datetime': '2020-01-06T12:30:00.000Z'},
 {'id': '2', 'name': 'Johnny Johson2', 'datetime': '2020-01-06T14:00:00.000Z'},
 {'id': '1', 'name': 'Johnny Johson1', 'datetime': '2020-01-06T15:30:00.000Z'},
 {'id': '3', 'name': 'Johnny Johson3', 'datetime': '2020-01-06T15:30:00.000Z'}]

请注意,此方法至少需要 Python 3.5.