我在Python中有这个数据结构:
feature.set('selectedLevel', 'species');
如何添加每个字典的元素?输出应为:
result = {
"data": [
{
"2015-08-27": {
"clicks": 10,
"views":20
}
},
{
"2015-08-28": {
"clicks": 6,
}
}
]
}
我正在为此寻找Pythonic解决方案。任何使用Counter的解决方案都是受欢迎的,但我无法实现它。
我试过这个,但是我收到了一个错误:
{
"clicks":16, # 10 + 6
"views":20
}
答案 0 :(得分:1)
您的代码非常接近可行的解决方案,我们可以通过一些重要的更改来实现它。最重要的变化是我们需要迭代"data"
中的result
项。
from collections import Counter
result = {
"data": [
{
"2015-08-27": {
"clicks": 10,
"views":20
}
},
{
"2015-08-28": {
"clicks": 6,
}
}
]
}
counts = Counter()
for d in result['data']:
for k, v in d.items():
counts.update(v)
print(counts)
<强>输出强>
Counter({'views': 20, 'clicks': 16})
我们可以简化一点,因为我们不需要钥匙。
counts = Counter()
for d in result['data']:
for v in d.values():
counts.update(v)
您发布的代码会生成一个计数器列表,然后尝试对它们求和。我想这也是一个有效的策略,但遗憾的是内置的sum
并不知道如何将计数器添加到一起。但我们可以使用functools.reduce
来完成。
from functools import reduce
counters = []
for d in result['data']:
for v in d.values():
counters.append(Counter(v))
print(reduce(Counter.__add__, counters))
但是,我怀疑第一个版本会更快,特别是如果有很多要加在一起的dicts。此外,此版本消耗更多RAM,因为它保留了所有计数器的列表。
实际上我们可以使用sum
将计数器添加到一起,我们只需要给它一个空的计数器作为起始值。
print(sum(counters, Counter()))
我们可以将它组合成一个单行,通过使用生成器表达式来消除列表:
from collections import Counter
result = {
"data": [
{
"2015-08-27": {
"clicks": 10,
"views":20
}
},
{
"2015-08-28": {
"clicks": 6,
}
}
]
}
totals = sum((Counter(v) for i in result['data'] for v in i.values()), Counter())
print(totals)
<强>输出强>
Counter({'views': 20, 'clicks': 16})
答案 1 :(得分:0)
这不是最好的解决方案,因为我确信有些库可以让您以更简洁的方式获得它,但它可以轻松地读取。
res = {}
for x in my_dict['data']:
for y in x:
for t in x[y]:
res.setdefault(t, 0)
res[t] += x[y][t]
print(res) # {'views': 20, 'clicks': 16}