词典列表中的列表理解

时间:2018-11-01 11:30:28

标签: python

我有下面的词典列表:

allChannelTraffic = [ { "Web" : 4, "android" : 3 }, { "Web" : 1 }, { "Web" : 1 }, { "Web" : 1 },]

我想知道从以上列表中获得这种输出的最简单的方法:

[{'Web':7,'android':3}]  

我要获取所有键值的总和。听说在python中使用列表理解,我们可以轻松地进行操作。有人可以告诉我如何使用列表理解来实现吗?

5 个答案:

答案 0 :(得分:4)

您可以将Countersum结合使用:

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)])}]