【问题标题】:Accessing the values of a key访问键的值
【发布时间】:2014-07-13 09:30:13
【问题描述】:

我有一本像这样的字典:

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 中,单元结构存在这样的东西。

【问题讨论】:

  • 我发现@iCodez的答案更好;我不必导入模块...我可能会使用'.itervalues()' 来实现。
  • 哦,所以您只是在问如何从字典中获取值?有人可能会将此标记为重复问题...
  • 正如我在问题中所写,我正在搜索&lt;unknown operator&gt;,但找不到任何类似或相关的内容。因此,我需要将其作为一个新问题提出。即使在给我的问题命名时,我也不确定如何陈述它(可以通过我的编辑历史来检查)......
  • @AaronHall,例如在上面给出的示例中,它只是一个求和运算。但例如可以是:Data["weight_factors"]["parameter1"]*Data["weight_factors"]["parameter2"]+Data["weight_factors"]["parameter3"]。但我不想重复输入Data["weight_factors"]。这就是我正在寻找的东西。

标签: python dictionary


【解决方案1】:

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

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

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

但这有点效率低下,对可读性也不是很好。

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

>>> 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"]

它是尽可能干净和高效的。

【讨论】:

  • 对,我可以使用 sum() 和 .values()。感谢您的答复。但我实际上正在寻找一个通用的解决方案。如果不存在,我肯定会使用您的建议!
  • 我认为您需要更具体地了解您所追求的“通用解决方案”;无论如何,iCodez 的回答完全解决了我认为您要问的问题。
  • @DSM 我实际上正在寻找一个“未知运算符”,我在我的问题中已经说过了。但是不知道有没有这样的算子存在……
  • @iCodez 我想这就是我的问题的真正答案,或者更准确地说:我正在寻找的答案。我不知道接受你的回复是否会导致一些激进的用户和其他一些读者产生误解。也许你需要稍微修改一下你的回复;)
  • @T-1000 - 然后我会将我的评论合并到我的答案中。 :)
【解决方案2】:

对于从映射或索引中重复获取相同项目的通用解决方案,我建议使用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

【讨论】:

    【解决方案3】:

    如果这只是“我如何轻松且重复地访问字典的值?”你应该像这样分配它们,你可以一次又一次地重复使用它们。

    在 Python 2 中:

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

    在 Python 3 中,values 返回一个迭代器,您不能重复使用它,因此将其具体化为一个列表:

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

    然后你可以用它做任何你想做的事情:

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

    等等……

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-20
      • 1970-01-01
      • 1970-01-01
      • 2021-09-03
      • 2022-11-25
      • 1970-01-01
      • 2012-09-08
      • 1970-01-01
      相关资源
      最近更新 更多