此问题类似于帖子“Python - Convert list of single key dictionaries into a single dictionary”,其中假设我们保证词典列表中的不同键。我的问题是,如果我们有类似的键以及我们如何使用reduce函数会怎么样。
例如,我们有:
lst = [{'1': 'A'}, {'1': 'B'}, {'2': 'C'}, {'2': 'D'}, {'3': 'E'}]
我们希望成为:
dict = {'1': ['A', 'B'], '2': ['C', 'D'], '3': ['E']}
此外,帖子How to merge multiple dicts with same key?类似,只是在这里我们想要使用reduce方法。
答案 0 :(得分:1)
好的,从相关问题中获取灵感,你可以这样做:
In [12]: from collections import defaultdict
...: from functools import reduce
In [13]: lst = [{'1': 'A'}, {'1': 'B'}, {'2': 'C'}, {'2': 'D'}, {'3': 'E'}]
In [14]: def foo(r, d):
...: for k in d:
...: r[k].append(d[k])
...:
In [16]: d = reduce(lambda r, d: foo(r, d) or r, lst, defaultdict(list))
In [17]: d
Out[17]: defaultdict(list, {'1': ['A', 'B'], '2': ['C', 'D'], '3': ['E']})
你需要一个中间函数来进行更新...我认为有更好的方法来做到这一点,但这是它的关键。
现在,如果您想要一种更清晰,更易读的方式,您可以这样做:
In [12]: from collections import defaultdict
In [30]: lst = [{'1': 'A'}, {'1': 'B'}, {'2': 'C'}, {'2': 'D'}, {'3': 'E'}]
In [31]: d = defaultdict(list)
In [32]: for i in lst:
...: k, v = list(i.items())[0] # an alternative to the single-iterating inner loop from the previous solution
...: d[k].append(v)
...:
In [33]: d
Out[33]: defaultdict(list, {'1': ['A', 'B'], '2': ['C', 'D'], '3': ['E']})
答案 1 :(得分:0)
我刚刚提出了一个使用reduce方法的函数的解决方案。
首先我们定义一个函数来检查密钥是否在dict之前插入。如果它是新密钥,我们会将其添加到带有列表值的dict中,如果它已经存在,我们会将该值附加到现有列表中。
def dict_list(each_dict):
d_key = each_dict.keys()[0]
d_value = each_dict.values()[0]
if d_key in return_dict:
return_dict[d_key].append(d_value)
else:
return_dict[d_key] = [d_value]
return return_dict
然后将此函数与reduce一起使用,如下所示:
lst = [{'1': 'A'}, {'1': 'B'}, {'2': 'C'}, {'2': 'D'}, {'3': 'E'}]
return_dict = {}
print reduce(lambda return_dict, each_dict: dict_list(each_dict), lst, {})
答案 2 :(得分:0)
您可以使用字典对象的setdefault()
属性:
>>> def combine(dictionaries):
combined_dict = {}
for dictionary in dictionaries:
for key, value in dictionary.items():
combined_dict.setdefault(key, []).append(value)
return combined_dict
>>>
>>> lst = [{'1': 'A'}, {'1': 'B'}, {'2': 'C'}, {'2': 'D'}, {'3': 'E'}]
>>> combine(lst)
{'1': ['A', 'B'], '2': ['C', 'D'], '3': ['E']}
>>>
这基本上可以通过首先检查新词典中是否已存在该键来实现。如果是,我们只需将当前值附加到同一个键。如果没有,我们创建一个新密钥并将当前值附加到该密钥。