访问密钥的值

时间:2014-05-23 22:19:51

标签: python dictionary

我有一本字典:

Data = {
    "weight_factors" : {
        "parameter1" : 10,
        "parameter2" : 30,
        "parameter3" : 30
        },
    "other_info" : {
        }
}

我想获得密钥"weight_factors"下的所有值的总和:

sum = Data["weight_factors"]["parameter1"] + 
      Data["weight_factors"]["parameter2"] + 
      Data["weight_factors"]["parameter3"] 

目前,为了避免重复输入Data["weight_factors"],我使用以下命令:

d = Data["weight_factors"]
d["parameter1"] + d["parameter2"] + d["parameter3"]

但是,我想应该有一个运算符执行相同的操作,而不将Data["weight_factors"]存储为中间变量。我想知道这样的命令或操作员是否存在。

Data["weight_factors"]<unknown operator>(["parameter1"] + 
                                         ["parameter2"] +
                                          ... 
                                         ["parametern"])<unknown operator>

修改 在上面给出的例子中,它只是一个求和操作。但它可以是例如:

Data["weight_factors"]["parameter1"] * Data["weight_factors"]["parameter2"] + Data[‌​"weight_factors"]["parameter3"]

但我不想反复输入Data["weight_factors"]。这就是我要搜索的东西......我不知道这样的运营商是否存在。 (在MATLAB中,存在用于单元结构的东西)。

3 个答案:

答案 0 :(得分:5)

不,built-in dict type不存在这种运算符。

我想你可以创建自己的继承自dict的dict类型并重载运算符:

class MyDict(dict):
    def __add__(self, other):
        """Overload the + operator."""
...

但这有点效率低,而且对可读性不太好。

如果您只想对这些值求和,则可以使用sumdict.valuesdict.itervalues如果您使用的是Python 2.x):

>>> Data = {
... "weight_factors" : {
...     "parameter1" : 10,
...     "parameter2" : 30,
...     "parameter3" : 30
...     },
... "other_info" : {
...     }
... }
>>> sum(Data["weight_factors"].values())
70
>>>

否则,我会使用你现在拥有的东西:

d = Data["weight_factors"]
myvar = d["parameter1"] * d["parameter2"] + d["parameter3"]

它尽可能干净,高效。

答案 1 :(得分:0)

对于从映射或索引重复获取相同项目的一般解决方案,我建议operator模块itemgetter

>>> import operator

>>> Data = {
    "weight_factors" : {
        "parameter1" : 10,
        "parameter2" : 30,
        "parameter3" : 30
        },
    "other_info" : {
        }
    }

现在创建我们简单的getter:

>>> get = operator.itemgetter('weight_factors')

每当你想要你的子字典时,就在对象上调用它:

>>> get(Data)['parameter1']

返回:

10

>>> sum(get(Data).values())

返回

70

答案 2 :(得分:0)

如果这只是“我如何轻易地重复访问dict的值?”你应该像这样分配它们,你可以反复重复使用它们。

在Python 2中:

vals = Data['weight_factors'].values() 

在Python 3中,值返回一个迭代器,你不能重用它,所以在列表中实现它:

vals = list(Data['weight_factors'].values()) 

然后你可以随心所欲地做任何事情:

sum(vals)
max(vals)
min(vals)

等...