数组组和中的python嵌套dict

数组组和中的python嵌套dict,python,dictionary,Python,Dictionary,我在Python中有这样的数据结构: result = { "data": [ { "2015-08-27": { "clicks": 10, "views":20 } }, { "2015-08-28": { "clicks": 6, }

我在Python中有这样的数据结构:

result = {
    "data": [
        {
            "2015-08-27": {
                "clicks": 10,
                "views":20

            }
        },
        {
            "2015-08-28": {
                "clicks": 6,
            }
        }
    ]
}
如何添加每个词典的元素?输出应为:

{
    "clicks":16, # 10 + 6
    "views":20
}
我正在寻找一个Pythonic解决方案。任何使用计数器的解决方案都是受欢迎的,但我无法实现它

我已尝试此操作,但出现错误:

counters = []
for i in result:
    for k,v in i.items():
        counters.append(Counter(v))

sum(counters)

这不是最好的解决方案,因为我确信有一些库可以以不太冗长的方式将您带到那里,但它是一个您可以轻松阅读的库


您的代码非常接近于一个可行的解决方案,我们可以通过一些重要的更改使其工作。最重要的变化是我们需要迭代
结果
中的
“数据”

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})
Counter({'views': 20, 'clicks': 16})

我们可以简化一下,因为我们不需要钥匙

counts = Counter()
for d in result['data']:
    for v in d.values():
        counts.update(v)

您发布的代码生成计数器列表,然后尝试对其求和。我想这也是一个有效的策略,但不幸的是,
sum
内置不知道如何将计数器添加到一起。但我们可以用电脑来做

然而,我怀疑第一个版本会更快,特别是如果有很多dict要添加在一起的话。此外,这个版本会消耗更多的RAM,因为它保存了所有计数器的列表


实际上,我们可以使用将计数器相加,我们只需要给它一个空计数器作为起始值

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})
Counter({'views': 20, 'clicks': 16})

您可能因为没有显示自己的代码尝试而获得了所有这些否决票。记住,即使是坏掉的相关代码也比没有代码好。我做了我尝试过的编辑。我认为我的错误解决方案是无关紧要的,那好多了!向我们展示错误的解决方案表明,你试图做这项工作,但你并不懒惰。但更重要的是,这段糟糕的代码帮助我们看到了您在理解Python如何工作时出现的错误,这有助于我们写出能够纠正这些误解的答案。@PM2Ring感谢lotIf i maulally使用+进行迭代和求和,它只显示使用sum()没有错误if shows+不能与counter一起使用任何关于为什么会发生这种情况的想法?计数器已经计数了,您不需要手动求和。@anekix我已经在我的答案中添加了更多关于这一点的信息。@ChristianKönig当然,如果您将所有结果累加到一个计数器中,就像在我的第一个解决方案中一样,这很好。但如果您试图将多个计数器添加到一起,则会出现问题。@PM2Ring非常感谢您的解释,现在我明白了