如何删除字典列表中重复的字典?

时间:2015-11-15 23:03:29

标签: python list dictionary

我在Python中有一个列表:

[{u'key': u'Central District', u'doc_count': 21468},
 {u'key': u'Central District', u'doc_count': 6190},
 {u'key': u'Central District', u'doc_count': 2060},
 {u'key': u'Mexico', u'doc_count': 1884}]

但我需要把它变成这个:

[{u'key': u'Central District', u'doc_count':  29718},
 {u'key': u'Mexico', u'doc_count': 1884}]

如何消除其中一个重复元素(在本例中为“中心区”),并获取每个“中心区”的doc_count值的总和?

3 个答案:

答案 0 :(得分:2)

Itertools和reduce可以帮助对按键分组的值求和。

from itertools import groupby

original = [{u'key': u'Central District', u'doc_count': 21468},
            {u'key': u'Central District', u'doc_count': 6190},
            {u'key': u'Central District', u'doc_count': 2060},
            {u'key': u'Mexico', u'doc_count': 1884}]

def sum_reduce(obj1, obj2):
    return {'key': obj1['key'], 'doc_count': obj1['doc_count'] + obj2['doc_count']}

combined = [reduce(sum_reduce, group) for _, group in groupby(original, lambda x: x['key'])]

print combined 
# output: 
# [{'key': u'Central District', 'doc_count': 29718}, {u'key': u'Mexico',  u'doc_count': 1884}]

答案 1 :(得分:0)

我不知道你为什么使用这种糟糕的数据结构。

这就是我要做的事情:

old_data = [{u'key': u'Central District', u'doc_count': 21468},
 {u'key': u'Central District', u'doc_count': 6190},
 {u'key': u'Central District', u'doc_count': 2060},
 {u'key': u'Mexico', u'doc_count': 1884}]

#  STORE DATA AS key:value of -: Location: Doc count
new_data = {}

for values in old_data:
    if values['key'] not in new_data:
        new_data[values['key']] = values['doc_count']
    else:
        new_data[values['key']] += values['doc_count']

print(new_data)

输出:

{u'Central District': 29718, u'Mexico': 1884}

字典的目的是嵌套类似的数据并使用密钥来访问它。你的密钥实际上是“密钥”,而你正在使用一个列表存储dicts,这很疯狂。

在我的示例中,您可以使用“墨西哥”或“中心区”轻松访问密钥,返回的值将是文档计数!

答案 2 :(得分:-1)

list_of_dicts = [{u'key': u'Central District', u'doc_count': 21468},
                 {u'key': u'Central District', u'doc_count': 6190},
                 {u'key': u'Central District', u'doc_count': 2060},
                 {u'key': u'Mexico', u'doc_count': 1884}]

def do_stuff(list_of_dicts):
    TO_COUNT = u'Central District'
    to_count_sum = 0
    res_list = []
    for dictry in list_of_dicts:
        if dictry["key"] == to_count:
            to_count_sum += dictry[u'doc_count']
        else:
            res_list.append(dictry)
    dicty = {u'key': to_count,
             u'doc_count': to_count_sum}
    res_list.append(dicty)
    return res_list

assert do_stuff(list_of_dicts) == [{'key': 'Mexico', 'doc_count': 1884}, {'key': 'Central District', 'doc_count': 29718}]