使用reduce方法将具有相似/重复键的字典列表转换为单个字典(值将列表)

时间:2017-07-07 04:06:23

标签: python dictionary

此问题类似于帖子“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方法。

3 个答案:

答案 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']}
>>> 

这基本上可以通过首先检查新词典中是否已存在该键来实现。如果是,我们只需将当前值附加到同一个键。如果没有,我们创建一个新密钥并将当前值附加到该密钥。