获取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中,问题始终涉及相同的密钥,但在我的情况下,每行中的密钥可能是以前从未遇到的新密钥。
答案 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
字典。
请注意,与所提出的许多答案不同,此实现(与您的一样!)将对数据的扫描次数最小化为仅仅一次性能获胜(我尽可能轻松获得尽可能多的轻松性能)。