如何在python中对一个字典中所有对象的值求和

2024-03-28 20:54:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下格言:

data = {
    'test1': {
        'x1': {
            'z1': 22,
            'z2': 11,
            'z3': 21,
        },
        'x2': {
            'z1': 15,
            'z2': 34,
            'z3': 54,
        }
    },
    'test2': {
        'x1': {
            'z1': 22,
            'z2': 11,
            'z3': 21,
        },
        'x2': {
            'z1': 15,
            'z2': 34,
            'z3': 54,
        }
    }
}

我想做的是求“test1”中所有z2对象的和,在本例中,得到45

我知道我可以这样做:

data['test1']['x1']['z2'] + data['test1']['x2']['z2']

但我想知道是否有机会在一个代码,例如,采取它

data['test1'][ * ]['z2']其中星号表示所有对象(比如在excel中-这个示例当然不起作用)

想知道这个问题有没有更好的解决办法

会感谢你的支持


Tags: 对象代码data星号excel机会x1x2
2条回答

我认为,Python的pandas库将是一个很好的工具,可以轻松地解决此类问题。你知道吗

请看下面的代码。你知道吗

>>> import pandas as pd
>>>
>>> data = {
...     'test1': {
...         'x1': {
...             'z1': 22,
...             'z2': 11,
...             'z3': 21,
...         },
...         'x2': {
...             'z1': 15,
...             'z2': 34,
...             'z3': 54,
...         }
...     },
...     'test2': {
...         'x1': {
...             'z1': 22,
...             'z2': 11,
...             'z3': 21,
...         },
...         'x2': {
...             'z1': 15,
...             'z2': 34,
...             'z3': 54,
...         }
...     }
... }
>>>
>>> d = data["test1"]
>>> d
{'x1': {'z1': 22, 'z2': 11, 'z3': 21}, 'x2': {'z1': 15, 'z2': 34, 'z3': 54}}
>>>
>>> df = pd.DataFrame(list(d.values()), index=list(d.keys()))
>>> df
    z1  z2  z3
x1  22  11  21
x2  15  34  54
>>>
>>> df.z2.sum()    # 1st way
45
>>>
>>> df["z2"].sum() # 2nd way
45
>>>
参考资料»

您可以使用sum

d = {'test1': {'x1': {'z1': 22, 'z2': 11, 'z3': 21}, 'x2': {'z1': 15, 'z2': 34, 'z3': 54}}, 'test2': {'x1': {'z1': 22, 'z2': 11, 'z3': 21}, 'x2': {'z1': 15, 'z2': 34, 'z3': 54}}}
result = sum(b['z2'] for a, b in d['test1'].items())

输出:

45

编辑:如果没有显式循环,可以使用reduce

from functools import reduce
new_result = reduce(lambda x, y:x+y['z2'], d['test1'].values(), 0)

输出:

45

相关问题 更多 >