python嵌套dict在数组group和中

时间:2017-02-22 12:07:56

标签: python dictionary

我在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
}

2 个答案:

答案 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}