【问题标题】:Use variable as key name in python dictionary在python字典中使用变量作为键名
【发布时间】:2018-10-30 13:00:55
【问题描述】:

这感觉多余:

name = 'Isaiah'
myInfo = {
  'name': name
}

有没有更短的、惯用的方法来做到这一点,比如在 JavaScript 中:

myInfo = { name }

编辑:将变量名从dict 更改为myInfo,因为dict 是关键字。

【问题讨论】:

  • 在这个简短的例子中,它的{'name':'Isaiah'},但一般来说,如果你想将一个变量分配给一个字典,这几乎就是它。请注意在 python 中 { name }set
  • @tdelaney 好吧,我希望变量的 name 是键,变量的值是值。

标签: python python-2.7 dictionary


【解决方案1】:

不,没有。同样,这种语法也不太可能出现,因为结构

{name}

已为set literals保留。

您的另一种选择是使用dict constructor

d = dict(name=name)

附:由于dict 是在builtins 模块中定义的名称,请不要将变量命名为dict

【讨论】:

    【解决方案2】:

    我今天来到 SO 是因为我有同样的问题。我必须说,我对答案感到非常沮丧!我同意你的观点,这种冗余应该有一个惯用的解决方案。这是 Javascript 似乎比 Python 更明智的罕见情况。所以我想补充两个建议。

    首先,只是说 Abarnert 是正确的,如果它只有一个或两个变量,你应该是明确的。我会说,即使它不止于此,显式构造通常会更好。但我确实认为在某些情况下允许使用捷径。例如,我有一个构建字典以通过 Python 请求发送数据的文件。这就是它所做的一切。在每一个情况下,我最终都会制作一个字典,其中的键与我定义的变量相同。我认为这将是一个可以使用快捷方式的文件示例。

    首先,您可以使用 eval 内置函数。通常避免使用此命令,但在这种情况下它可以提供帮助,因为它可以接收作为变量名称的字符串,并吐出变量值:

    def main():
        #variables
        foo = "hello world"
        bar = 10
        baz = [1, 2, 3]
    
        # Build the dictionary:
        args = ("foo", "bar", "baz")
        dictionary = dict()
        for arg in args:
            dictionary[arg] = eval(arg)
        print(dictionary)
    
    
    if __name__ == "__main__":
        main()
    

    试试看。请注意,由于范围可变,很难将此功能包装到某种类或函数中。即使使用字典理解也会失败。但是,如果您愿意在这样的函数中添加 3 行平面,它会起作用。

    其次,考虑是否可以在构建字典时将值分配给变量。所以而不是:

    foo = 4+5
    dictionary = dict(foo=foo)
    

    试试:

    dictionary = dict(
        foo=4+5
    )
    

    如果需要在后面的计算中使用较早的值,请先初始化字典,然后再结合计算和dict赋值:

    dictionary = dict()
    dictionary['foo'] = 4 + 5
    dictionary['bar'] = dictionary['foo'] + 9
    

    我认为对上述情况也有帮助的是新的 PEP,它允许您在计算中分配别名。 BDFL 辞职的那个。因此,让我们希望尽快实施!

    最后,快速评论一下已接受的答案,Python 已经使用 {} 表示集合这一事实并不意味着我们不能创建此功能(为什么不使用 或 D() 之类的? )。只是我的2美分。我认为这是一个必要的功能。

    【讨论】:

      【解决方案3】:

      在极少数情况下,您尝试从本地、全局或自身命名空间的巨大和/或动态子集中创建字典,您可以通过过滤适当的命名空间来做到这一点:

      keys = set('name age height balance hoopiness'.split())
      d = {key: value for (key, value) in locals().items()
           if key in keys}
      

      但对于一个简单的案例,显然不值得这样做。你能做到的最短的应该是:

      d = {key: value for (key, value) in locals().items() if key == 'name'}
      

      ...确实避免重复name,但非常非常愚蠢。

      如果只是从一个或两个静态命名的变量中创建一个字典,你应该是明确的:

      d = {'name': name}
      d = dict(name=name)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-31
        • 2023-03-19
        • 2022-10-13
        • 2012-01-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多