如何对一个dicts列表求和

2024-10-01 22:41:42 发布

您现在位置:Python中文网/ 问答频道 /正文

获取dict列表并从列表中的每一行汇总匹配键的所有值的最python方法是什么?在

我这么做了,但我怀疑一种理解更像Python:

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中,问题始终涉及同一个键,但在我的例子中,每行中的键可能是以前从未遇到过的新键。在


Tags: to方法infromimport列表newfor
3条回答

代码中唯一不清楚的是double for循环。如果将demandlist压缩成一个平坦的iterable,那么loopant将尽可能简单地呈现逻辑。考虑:

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压缩成一个key valiterable,我不特别关心如何,然后求出匹配键的值。”

不幸的是,我需要map来确保最后一个iterable具有key-val对……it.chain.from_iterable(demandlist)是一个只包含key的iterable,所以我需要在每个dict上调用items

请注意,与许多建议的答案不同,这个实现(就像您的!)尽可能减少对数据的扫描次数,以获得一次性能上的胜利(我尽可能多地获得简单的性能胜利)。在

下面是另一个使用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}

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

我认为你的方法很像Python。理解是很好的,但是它们不应该太过分,而且它们会导致非常混乱的一行语句,比如下面的一行:)。在

如果你坚持要做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}

相关问题 更多 >

    热门问题