通过字典中的键值组合两个字典列表

时间:2019-06-19 00:37:40

标签: python python-3.x

我有两个列表,其元素为字典。

list1 = [
    {'id': 1, 'color': 'purple', 'size': 10},
    {'id': 2, 'color': 'red', 'size': 25},
    {'id': 3, 'color': 'orange', 'size': 1},
    {'id': 4, 'color': 'black', 'size': 100},
    {'id': 5, 'color': 'green', 'size': 33}
]

list2 = [
    {'id': 2, 'width': 22, 'age': 22.3},
    {'id': 5, 'width': 9, 'age': 1.7}
]

我想要第三个列表,其长度与较大的列表相同,并且较小的列表中有一个字典元素,且其ID与较大的列表中的字典元素相匹配,请合并两个字典,以便最终输出如下所示:

list3 = [
    {'id': 1, 'color': 'purple', 'size': 10},
    {'id': 2, 'color': 'red', 'size': 25, 'width': 22, 'age': 22.3},
    {'id': 3, 'color': 'orange', 'size': 1},
    {'id': 4, 'color': 'black', 'size': 100},
    {'id': 5, 'color': 'green', 'size': 33, 'width': 9, 'age': 1.7}
]

理想情况下,如果可以在不循环访问两个列表的情况下完成此操作,那将是理想的选择。

2 个答案:

答案 0 :(得分:3)

尝试使用dict带有拆包的ionary和next以及另一个列表理解的嵌套列表理解:

list3 = [{**i, **next(iter([x for x in list2 if x['id'] == i['id']]), {})} for i in list1]

现在:

print(list3)

是:

[{'id': 1, 'color': 'purple', 'size': 10}, {'id': 2, 'color': 'red', 'size': 25, 'width': 22, 'age': 22.3}, {'id': 3, 'color': 'orange', 'size': 1}, {'id': 4, 'color': 'black', 'size': 100}, {'id': 5, 'color': 'green', 'size': 33, 'width': 9, 'age': 1.7}]

答案 1 :(得分:0)

使用defaultdict

from collections import defaultdict

list1 = [
    {'id': 1, 'color': 'purple', 'size': 10},
    {'id': 2, 'color': 'red', 'size': 25},
    {'id': 3, 'color': 'orange', 'size': 1},
    {'id': 4, 'color': 'black', 'size': 100},
    {'id': 5, 'color': 'green', 'size': 33}
]

list2 = [
    {'id': 2, 'width': 22, 'age': 22.3},
    {'id': 5, 'width': 9, 'age': 1.7}
]

dict1 = defaultdict(dict)

for l in (list1, list2):
    for elem in l:
        dict1[elem['id']].update(elem)
list3 = dict1.values()

print(list(list3))

O / P:

[
  {
    'id': 1,'color': 'purple','size': 10
  },
  {
    'id': 2,'color': 'red','size': 25,'width': 22,'age': 22.3
  },
  {
    'id': 3,'color': 'orange','size': 1
  },
  {
    'id': 4,'color': 'black','size': 100
  },
  {
    'id': 5, 'color': 'green','size': 33, 'width': 9,'age': 1.7
  }
]
  

list3不能保证被排序(.values()返回no的项目   具体顺序,您可以尝试排序。

from operator import itemgetter
...
new_list = sorted(dict1.values(), key=itemgetter("id"))