我有下面的词典列表:
allChannelTraffic = [ { "Web" : 4, "android" : 3 }, { "Web" : 1 }, { "Web" : 1 }, { "Web" : 1 },]
我想知道从以上列表中获得这种输出的最简单的方法:
[{'Web':7,'android':3}]
我要获取所有键值的总和。听说在python中使用列表理解,我们可以轻松地进行操作。有人可以告诉我如何使用列表理解来实现吗?
答案 0 :(得分:4)
from collections import Counter
allChannelTraffic = [{"Web": 4, "android": 3}, {"Web": 1}, {"Web": 1}, {"Web": 1}, ]
result = sum(map(Counter, allChannelTraffic), Counter())
print(result)
输出
Counter({'Web': 7, 'android': 3})
答案 1 :(得分:1)
列表推导在这里并不是真正有用的。
生成器表达式允许我们执行以下操作:
allChannelTraffic = [ { "Web" : 4, "android" : 3 }, { "Web" : 1 }, { "Web" : 1 }, { "Web" : 1 },]
keys = set(k for d in allChannelTraffic for k in d.keys())
totals = {key: sum(d.get(key, 0) for d in allChannelTraffic) for key in keys}
print(totals)
# {'Web': 7, 'android': 3}
最后一个{key: sum([...]) for key in keys}
是字典理解。
我本可以使用集合理解来代替第2行中的set()
:
{k ... for k in d.keys()}
== set(k ... for k in d.keys())
但是我不愿意这样做,因为set()
对于读者来说更加清晰。
通常,对于没有经验的pythonista来说,针对问题的Counter或Defaultdict方法可能更容易理解。...
答案 2 :(得分:0)
您可以使用collections.defaultdict
来汇总每个键的值
import collections
totals = collections.defaultdict(int)
for sub in allChannelTraffic:
for key, value in sub.items():
totals[key] += value
输出
>>> totals
defaultdict(<class 'int'>, {'android': 3, 'Web': 7})
答案 3 :(得分:0)
这不是列表理解,但是您随时可以在此处使用Counter.update()
:
from collections import Counter
allChannelTraffic = [ { "Web" : 4, "android" : 3 }, { "Web" : 1 }, { "Web" : 1 }, { "Web" : 1 }]
counts = Counter()
for d in allChannelTraffic:
counts.update(d)
print(counts)
# Counter({'Web': 7, 'android': 3})
非图书馆方法看起来像这样:
allChannelTraffic = [ { "Web" : 4, "android" : 3 }, { "Web" : 1 }, { "Web" : 1 }, { "Web" : 1 }]
counts = {}
for d in allChannelTraffic:
for k in d:
counts[k] = counts.get(k, 0) + d[k]
print(counts)
# Counter({'Web': 7, 'android': 3})
答案 4 :(得分:0)
allChannelTraffic = [ { "Web" :4,"android" : 3 }, { "Web" : 1 }, { "Web" : 1 },{ "Web" : 1 },]
allChannelTraffic = [{"web": sum([item[1].get("Web",0) for item in enumerate(allChannelTraffic)]), "android":sum([item[1].get("android",0) for item in enumerate(allChannelTraffic)])}]