在python中使用带嵌套字典的计数器

ane*_*kix 6 python

我在python中有一个dicts列表,如下所示:

[
  {
    "25-34": {
      "Clicks": 10
    },
    "45-54": {
      "Clicks": 2
    },

  },
  {
    "25-34": {
      "Clicks": 20
    },
    "45-54": {
      "Clicks": 10
    },

  }   
]
Run Code Online (Sandbox Code Playgroud)

如何获得列表的每个字典中的键的总和,以便我有:

{
    "25-34": {
        "Clicks": 30
    },
    "45-54": {
        "Clicks": 12
    },

}
Run Code Online (Sandbox Code Playgroud)

我尝试使用Counter()但是当dicts内部列表是平的时它很容易工作,但是如上面的嵌套dicts它给出了这个错误:

    /usr/lib/python2.7/collections.pyc in update(self, iterable, **kwds)
        524                     self_get = self.get
        525                     for elem, count in iterable.iteritems():
    --> 526                         self[elem] = self_get(elem, 0) + count
        527                 else:
        528                     super(Counter, self).update(iterable) # fast path when counter is empty

TypeError: unsupported operand type(s) for +: 'dict' and 'dict'
Run Code Online (Sandbox Code Playgroud)

如何实现如上所述的求和.

注意:我clicks刚添加了样品.嵌套的dicts可以没有任何键,另一个例子是为了使它更清晰:

[
  {
    "25-34": {
      "Clicks": 10,
      "Visits": 1
    },
    "45-54": {
      "Clicks": 2,
      "Visits": 2
    },

  },
  {
    "25-34": {
      "Clicks": 20,
      "Visits": 3
    },
    "45-54": {
      "Clicks": 10,
      "Visits": 4
    },

  }   
]
Run Code Online (Sandbox Code Playgroud)

输出:

{
    "25-34": {
      "Clicks": 30,
      "Visits": 4
    },
    "45-54": {
      "Clicks": 12,
      "Visits": 6
    },

  }  
Run Code Online (Sandbox Code Playgroud)

jua*_*aga 5

从您的编辑中,听起来您只是试图通过父词典来对所有子词的进行求和:

In [9]: counts = Counter()

In [10]: for dd in data:
    ...:     for k,v in dd.items():
    ...:         counts[k] += sum(v.values())
    ...:

In [11]: counts
Out[11]: Counter({'25-34': 30, '45-54': 12})
Run Code Online (Sandbox Code Playgroud)

从根本上说,这是一个笨拙的数据结构.

好的,鉴于您的上一次更新,我认为最简单的方法是defaultdictCounter工厂合作:

In [17]: from collections import Counter, defaultdict

In [18]: counts = defaultdict(Counter)

In [19]: for dd in data:
    ...:     for k, d in dd.items():
    ...:         counts[k].update(d)
    ...:

In [20]: counts
Out[20]:
defaultdict(collections.Counter,
            {'25-34': Counter({'Clicks': 30, 'Visits': 4}),
             '45-54': Counter({'Clicks': 12, 'Visits': 6})})
Run Code Online (Sandbox Code Playgroud)