2017-05-31 89 views
-9

具有相同价值的dict的多个名单上有类型的字典合并的公用密钥

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”的4名单。应该合并所有列表中具有相同值的'a'键。

我应该得到的输出为:

[{'a':0,'b':23,'c':0,'d':775},{'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}] 

usings最小循环或清单列表理解

+1

您能否介绍一下如何连接这四个列表的逻辑?算法的简单步骤列表可能就足够了。请同时分享您已经尝试过的任何代码。 –

+0

所有列表都有一个公用密钥'a'。应该合并所有列表中具有相同值的'a'键。 – Ann

+0

应该如何处理重复键,即如果两个字典中的“a == 0”和两个字典中的键“b”存在,应该保留哪个值。你试过什么了? –

回答

0

如果你想要一个更Python的方式:

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 
+0

我刚刚使用itemgetter而不是lambdas添加了性能改进。 – Strinnityk