如何总结一个dicts列表

时间:2018-04-18 00:12:32

标签: python dictionary

获取dicts列表的最Pythonic方法是什么,并总结列表中每行匹配键的所有值?

我做到了这一点,但我怀疑理解是更多Pythonic:

from collections import defaultdict
demandresult = defaultdict(int)   # new blank dict to store results 
for d in demandlist:
    for k,v in d.iteritems():
        demandresult[k] = demandresult[k] + v

Python - sum values in dictionary中,问题始终涉及相同的密钥,但在我的情况下,每行中的密钥可能是以前从未遇到的新密钥。

4 个答案:

答案 0 :(得分:2)

我认为你的方法非常pythonic。理解很好,但它们不应该过度,并且它们可能导致非常混乱的单行,如下所示:)。

如果你坚持使用dict comp:

demand_list = [{u'2018-04-29': 1, u'2018-04-30': 1, u'2018-05-01': 1}, 
               {u'2018-04-21': 1},
               {u'2018-04-18': 1, u'2018-04-19': 1, u'2018-04-17' : 1}]

d = {key:sum(i[key] for i in demand_list if key in i) 
     for key in set(a for l in demand_list for a in l.keys())}

print(d)
>>>{'2018-04-21': 1, '2018-04-17': 1, '2018-04-29': 1, '2018-04-30': 1, '2018-04-19': 1, '2018-04-18': 1, '2018-05-01': 1}

答案 1 :(得分:1)

这是使用collections.ChainMap获取组合键的另一个单行(ab-):

>>> from collections import ChainMap
>>> {k: sum(d.get(k, 0) for d in demand_list) for k in ChainMap(*demand_list)}
{'2018-04-17': 1, '2018-04-21': 1, '2018-05-01': 1, '2018-04-30': 1, '2018-04-19': 1, '2018-04-29': 1, '2018-04-18': 1}

这是这里提出的最慢的方法。

答案 2 :(得分:0)

我想你想要返回每个字典的总和值列表。

list_of_dict = [
    {'a':1, 'b':2, 'c':3},
    {'d':4, 'e':5, 'f':6}
]

sum_of_each_row = [sum(v for v in d.values()) for d in list_of_dict] # [6,15]

如果你想要返回总和,只需将sum()包装到" sum_of_each_row"。

编辑:

主要问题是您没有为每个键设置默认值,因此您可以使用方法dict.setdefault()来设置新键时的默认值

list_of_dict = [
    {'a':1, 'b':1},
    {'b':1, 'c':1},
    {'a':2}
]

d = {}
d = {k:d[k]+v if k in d.keys() else d.setdefault(k,v)
    for row in list_of_dict for k,v in row.items()} # {'a':3, 'b':2, 'c':1}

答案 3 :(得分:0)

你的代码中唯一似乎不清楚的是双循环。将demandlist折叠成平坦的可迭代可能更清楚 - 然后循环子尽可能简单地呈现逻辑。考虑:

demandlist = [{
    u'2018-04-29': 1,
    u'2018-04-30': 1,
    u'2018-05-01': 1
}, {
    u'2018-04-21': 1
}, {
    u'2018-04-18': 1,
    u'2018-04-19': 1,
    u'2018-04-17': 1
}]

import itertools as it
from collections import defaultdict

demandresult = defaultdict(int)

for k, v in it.chain.from_iterable(map(lambda d: d.items(), demandlist)):
    demandresult[k] = demandresult[k] + v

(使用此功能,print(demandresult)打印defaultdict(<class 'int'>, {'2018-04-29': 1, '2018-04-30': 1, '2018-05-01': 1, '2018-04-21': 1, '2018-04-18': 1, '2018-04-19': 1, '2018-04-17': 1})。)

想象自己第一次(或几个月后)读到这个,我可以看到自己在想,“好吧,我正在将demandlist折叠成一个可重复的关键词,我并不特别在意如何,然后总结匹配键的值。“

很遗憾,我需要map那里确保最终的iterable具有key-val对... it.chain.from_iterable(demandlist)是一个只有密钥的可迭代,所以我需要在每个上调用items字典。

请注意,与所提出的许多答案不同,此实现(与您的一样!)将对数据的扫描次数最小化为仅仅一次性能获胜(我尽可能轻松获得尽可能多的轻松性能)。