python - 单行(或两行)中的 3 级嵌套字典中的挤压和求和值

标签 python dictionary grouping

我正在回答另一个 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,
            },
        },
}

我想压缩这些字典并添加insouts按特定时间对它们进行分组,而不考虑日期.假设我想知道“无论日期如何,每个时间桶有多少人进出我的 field ”或者用不同的措辞“我想知道有多少人进出我的 field ” outs total 从每个时间桶的时间开始就有了”

这将是为所有字典添加 insouts 的结果,这些字典的键是在 中找到的 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/

相关文章:

python - 用 Numpy 向量化操作替换 For 循环

python - 使用 ModelForm 的 Django 联系表单

Python 的 in (__contains__) 运算符返回一个 boolean 值,其值既不是 True 也不是 False

swift - 在 Swift 中循环创建字典

c++ - map C++ 上的 BAD_ACCES 迭代器

c# - 使用 IComparer 进行分组和排序

r - data.table 中的列表/多列分组条件中的列名

python |输入缓冲区中字节过多 RPLidarException : Incorrect Descriptor Starting Bytes when running and plotting with RPLIDAR

string - 找到每个词的频率

javascript - 使用 Gmail 应用脚本按月对标签计数进行分组