在python字典中使用变量作为键名

时间:2018-05-20 20:48:56

标签: python python-2.7 dictionary

这感觉多余:

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

是否有一种较短的惯用方法,例如JavaScript:

myInfo = { name }

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

3 个答案:

答案 0 :(得分:3)

不,没有。此外,这种语法不可能像构造

那样出现
{name}

已保留给set literals

另一种选择是使用dict constructor

d = dict(name=name)

P.S。由于dictbuiltins模块中定义的名称,因此请不要将变量命名为dict

答案 1 :(得分:0)

在极少数情况下,您尝试使用本地,全局或自命名空间的巨大和/或动态子集创建一个字典,您可以通过过滤相应的命名空间来实现:

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,但非常非常愚蠢。

只是用一个或两个静态命名的变量创建一个dict,你应该只是明确的:

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

答案 2 :(得分:0)

我今天来参加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美分。我认为这是必需的功能。