我在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
值的总和?
答案 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}]