我在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)
从您的编辑中,听起来您只是试图通过父词典来对所有子词的值进行求和:
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)
从根本上说,这是一个笨拙的数据结构.
好的,鉴于您的上一次更新,我认为最简单的方法是defaultdict与Counter工厂合作:
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)
| 归档时间: |
|
| 查看次数: |
1550 次 |
| 最近记录: |