【问题标题】:summing nested dictionary entries对嵌套字典条目求和
【发布时间】:2015-01-28 18:47:33
【问题描述】:

我有一个 JSON 文件,我正在将其作为字典读取。我所拥有的是这样的:

        "20101021": {
            "4x4": {
                "Central Spectrum": 5, 
                "Full Frame": 5, 
                "Custom": 1
            }, 
            "4x2": {
                "Central Spectrum": 5, 
                "Full Frame": 5
            }, 
            "1x1": {
                "Central Spectrum": 5, 
                "Full Frame": 4
            }, 
        }, 
        "20101004": {
            "4x4": {
                "Central Spectrum": 5, 
                "Full Frame": 5
            }, 
            "4x2": {
                "Central Spectrum": 5, 
                "Full Frame": 5
            }, 
            "1x1": {
                "Central Spectrum": 5, 
                "Full Frame": 5
            }

等等。 我正在尝试计算1x14x2(等)和Central SpectrumFull Frame 的所有组合的总和(在所有日期),在这个例子中我想加起来5s .

到目前为止我所拥有的是这个(使用itertoolsCounter()):

bins = map("x".join, itertools.product('124', repeat=2))
rois = ['Full Frame', 'Central Spectrum']
types = itertools.product(bins, rois)
c = collections.Counter(dict)
for type in types:
    print "%s : %d" % (type, c[type])

这会打印出所有组合的漂亮列表,但无法对值进行任何实际求和。你能帮忙吗?

【问题讨论】:

    标签: python json dictionary nested itertools


    【解决方案1】:

    也许我误解了预期的最终结果,但您可能不需要计数器...如果您知道您只会有两个级别的嵌套,那么一个简单的sum 就足够了。

    假设您已将 json 字典加载到名为 data 的变量中。

    那么你可以这样做:

    results = {}
    for key in data.keys():
        # key is '20101021', '20101004'...
        # data[key].keys() is '4x4, '4x2'... so let's make sure
        # that the result dictionary contains all those '4x4', '4x2'
        # being zero if nothing better can be calculated.
        results[key] = dict.fromkeys(data[key].keys(), 0)
    
        for sub_key in data[key].keys():
            # sub_key is '4x4', '4x2'...
            # Also, don't consider a 'valid value' someting that is not a
            # "Central Spectrum" or a "Full Frame"
            valid_values = [
                int(v) for k, v in data[key][sub_key].items()
                if k in ["Central Spectrum", "Full Frame"]
            ]
            # Now add the 'valid_values'
            results[key][sub_key] = sum(valid_values)
    print results
    

    哪些输出:

    {
      u'20101021': {u'1x1': 9, u'4x4': 10, u'4x2': 10},
      u'20101004': {u'1x1': 10, u'4x4': 10, u'4x2': 10}
    }
    

    在很多情况下,我只使用了dict.keys(),因为这可能会澄清流程? (嗯,一次dict.items())你也有dict.values()(所有的树函数都有它们的迭代器等价物),这可能会缩短你的代码。另外,看看dict.fromkeys 做了什么。

    编辑(根据 OP 对此答案的 cmets)

    如果您希望随着时间的推移添加(或“收集”)数据,那么您需要将您的results[key] 从日期字符串(如答案中所示)移动到1x14x4。 ..

    VALID_KEYS = ["Central Spectrum", "Full Frame"]
    results = {}
    for key_1 in data.keys():
        # key_1 is '20101021', '20101004'...
    
        for key_2 in data[key_1].keys():
            # key_2 is '4x4', '4x2'...
            if key_2 not in results:
                results[key_2] = dict.fromkeys(VALID_KEYS, 0)
            for key_3 in data[key_1][key_2].keys():
                # key_3 is 'Central Spectrum', 'Full Frame', 'Custom'...
                if key_3 in VALID_KEYS:
                    results[key_2][key_3] += data[key_1][key_2][key_3]
    print results
    

    哪些输出:

    {
        u'1x1': {'Central Spectrum': 10, 'Full Frame': 9},
        u'4x4': {'Central Spectrum': 10, 'Full Frame': 10},
        u'4x2': {'Central Spectrum': 10, 'Full Frame': 10}
    }
    

    【讨论】:

    • 感谢您的回复@BorrajaX!不幸的是,这并不是我想要的。我需要整理所有日期的最终统计数据,如下所示:1x1 Central Spectrum: 101x1 Full Frame: 94x4 Central Spectrum: 10 等。
    • 已编辑答案。这就是你要找的东西吗?
    • 这正是我想要的!非常感谢@BorrajaX 的帮助,并且没有像我显然那样被嵌套字典弄糊涂:)
    • 没问题 :-) 是的,dict "walking" 的主要问题是知道你在每一刻的位置(如果你使用一个线性理解,事情会变得更有趣... 乐趣!! )。我敢肯定,您很快就会掌握它。
    猜你喜欢
    • 2016-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多