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

在python字典中使用变量作为键名,python,python-2.7,dictionary,Python,Python 2.7,Dictionary,这感觉是多余的: name = 'Isaiah' myInfo = { 'name': name } 是否有一种更简短、惯用的方法来实现这一点,如JavaScript: myInfo = { name } Edit:将变量名从dict更改为myInfo,因为dict是一个关键字。不,没有。同样,这种语法也不太可能出现,就像构造一样 {name} 已经为您保留了 另一种选择是使用: 另外,由于dict是在builtins模块中定义的名称,因此请不要将变量命名为dict,在非常罕见的情况下

这感觉是多余的:

name = 'Isaiah'
myInfo = {
  'name': name
}
是否有一种更简短、惯用的方法来实现这一点,如JavaScript:

myInfo = { name }

Edit:将变量名从
dict
更改为
myInfo
,因为
dict
是一个关键字。

不,没有。同样,这种语法也不太可能出现,就像构造一样

{name}
已经为您保留了

另一种选择是使用:


另外,由于
dict
是在
builtins
模块中定义的名称,因此请不要将变量命名为
dict
,在非常罕见的情况下,您试图从本地、全局或自名称空间的巨大和/或动态子集中生成dict,您可以通过筛选适当的命名空间来实现这一点:

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'}
…这确实避免了重复
名称
,但是非常非常愚蠢

对于仅使用一个或两个静态命名变量创建dict,您应该是显式的:

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

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

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

首先,您可以使用
eval
builtin。通常避免使用此命令,但在这种情况下,它会有所帮助,因为它可以接收变量名称的字符串,并输出变量值:

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)
尝试:

如果需要在以后的计算中使用先前的值,请先初始化字典,然后将计算与dict赋值结合起来:

dictionary = dict()
dictionary['foo'] = 4 + 5
dictionary['bar'] = dictionary['foo'] + 9
我认为,在上述情况下,新的PEP可能也会有所帮助,它允许您在计算中分配别名。BDFL辞职的那个。所以,让我们希望它能很快得到实施


最后,对公认的答案,Python已经使用{}来表示set,这一事实只是一个简短的评论,并不意味着我们不能创建这个功能(为什么不能或D()或其他什么?)。只要我的2美分。我认为这是一个必需的特性。

在这个简短的例子中,它的
{'name':'Isaiah'}
,但一般来说,如果你想给dict分配一个变量,这几乎就是它。请注意,在python中,
{name}
是一个
集合
@tdelaney,我希望变量的名称是键,变量的值是值。
dictionary = dict(
    foo=4+5
)
dictionary = dict()
dictionary['foo'] = 4 + 5
dictionary['bar'] = dictionary['foo'] + 9