我有一本字典:
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中,存在用于单元结构的东西)。
答案 0 :(得分:5)
不,built-in dict type不存在这种运算符。
我想你可以创建自己的继承自dict
的dict类型并重载运算符:
class MyDict(dict):
def __add__(self, other):
"""Overload the + operator."""
...
但这有点效率低,而且对可读性不太好。
如果您只想对这些值求和,则可以使用sum
和dict.values
(dict.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)
等...