我有4个词典列表
list1 = [{'a':0,'b':23}, {'a':3,'b':77},{'a':1,'b':99}]
list2 = [{'a':1,'c':666},{'a':4,'c':546}]
list3 = [{'d':33,'a':3},{'d':1111,'a':4},{'d':76,'a':1},{'d':775,'a':0}]
list4 = [{'a':2,'e':12},{'a':4,'e':76}]
列表中的每个字典都有一个共同的键'a'。我的要求是'a'键在dict中具有相同值,来自所有列表应该合并,如果合并时在dicts中不存在特定键,则为这些键分配0或者只是省略这些键。 例如。对于值为1的键'a',从上面的示例我们有2个dicts,一个来自list1,即{'a':0,'b':23},一个是list3,最后一个dict即{'d':775,' a':0},所以我们首先确定了具有相同'a'值的dicts,现在需要合并这些dicts ie {'a':0,'b':23,'c':0,'d':775,'e':0},因为两个dict都没有'c','c'被分配这里为0
我应该得到输出:
[{'a':0,'b':23,'c':0,'d':775, 'e':0},{'a':1,'b':99,'c':666,'d':76,'e':0},{'a':2,'b':0,'c':0,'d':0,'e':12},{'a':3,'b':77,'c':0,'d':33,'e':0}, {'a':4,'b':0,'c':546,'d':1111,'e':76}]
使用最小循环或列表列表理解
答案 0 :(得分:1)
如果你想要一种更加pythonic的方式:
from itertools import groupby
from pprint import pprint
from collections import ChainMap
a = [{'a':0,'b':23}, {'a':3,'b':77}, {'a':1,'b':99}]
b = [{'a':1,'c':666}, {'a':4,'c':546}]
c = [{'d':33,'a':3}, {'d':1111,'a':4}, {'d':76,'a':1}, {'d':775,'a':0}]
d = [{'a':2,'e':12}, {'a':4,'e':76}]
dict_list = a + b + c + d
# You just need to specify the key you want to use in the lambda function
# There's no need to declare the different key values previously
res = map(lambda dict_tuple: dict(ChainMap(*dict_tuple[1])),
groupby(sorted(dict_list,
key=lambda sub_dict: sub_dict["a"]),
key=lambda sub_dict: sub_dict["a"]))
pprint(list(res))
输出:
[{'a': 0, 'b': 23, 'd': 775},
{'a': 1, 'b': 99, 'c': 666, 'd': 76},
{'a': 2, 'e': 12},
{'a': 3, 'b': 77, 'd': 33},
{'a': 4, 'c': 546, 'd': 1111, 'e': 76}]
编辑(改进):
您也可以使用
from _operator import itemgetter
key=itemgetter("a")
而不是
key=lambda sub_dict: sub_dict["a"]
带有itemgetter的版本要快得多。使用您提供的示例:
- Lambda: 0.037109375ms
- Itemgetter: 0.009033203125ms