我正在回答另一个 OP 的 question关于如何在嵌套字典中添加不同的项目,我想出了一个三层嵌套的 for
循环方法来在三级字典中添加项目,这很有效,但是 meeeh...我很确定可以做得更简洁。
提供一个真实的用例场景:假设我有一些来自某商店入口上方摄像头的数据,这些数据统计有多少人进和以 10 分钟为间隔存储:
data = {
"2014/01/01": {
"15:00:00" : {
"ins": 7,
"outs": 5,
},
"15:10:00" : {
"ins": 24,
"outs": 10,
},
"15:20:00" : {
"ins": 10,
"outs": 20,
},
},
"2014/01/02": {
"15:00:00" : {
"ins": 10,
"outs": 10,
},
"15:10:00" : {
"ins": 12,
"outs": 5,
},
"15:20:00" : {
"ins": 5,
"outs": 10,
},
},
}
我想压缩这些字典并添加ins和outs按特定时间对它们进行分组,而不考虑日期.假设我想知道“无论日期如何,每个时间桶有多少人进出我的 field ”或者用不同的措辞“我想知道有多少人进出我的 field ” outs total 从每个时间桶的时间开始就有了”
这将是为所有字典添加 ins 和 outs 的结果,这些字典的键是在 中找到的 time data
dict(忽略第一个日期“level”)使用上面提供的示例 data
,这将是:
"15:00:00": {
"ins": 17 # (7 + 10)
"outs": 15 # (5 + 10)
},
"15:10:00": {
"ins": 36 # (24 + 12)
"outs": 15 # (10 + 5)
},
"15:20:00": {
"ins": 15 # (10 + 5)
"outs": 30 # (20 + 10)
}
有没有办法......以某种方式(我猜测通过 itertools ,但我不知道哪些工具是正确的),从 data
开始,结束在一行(或两行)中得到上面显示的结果?
我一直在摆弄在中找到的答案
但我不知道如何得到我想要的。我要么得到一个 Counter
对象的列表(然后我不知道如何处理它们)要么我得到一个错误,因为我试图添加两个 dict
小...
我知道这真的没什么大不了的(三个 for
循环就可以完成工作),但我很好奇这样做的可行性,以及如何缩短我的代码(并且可能了解 itertools
,这是关于时间...)
提前谢谢你。
最佳答案
它比两行长一点,但是:
from collections import Counter, defaultdict
flattened = (time for day in data.itervalues() for time in day.iteritems())
sums = defaultdict(lambda: Counter())
for time, entries in flattened:
sums[time] += Counter(entries)
给出:
In [116]: dict(sums)
Out[116]:
{'15:00:00': Counter({'ins': 17, 'outs': 15}),
'15:10:00': Counter({'ins': 36, 'outs': 15}),
'15:20:00': Counter({'outs': 30, 'ins': 15})}
关于python - 单行(或两行)中的 3 级嵌套字典中的挤压和求和值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27232781/