这感觉多余:
name = 'Isaiah'
myInfo = {
'name': name
}
是否有一种较短的惯用方法,例如JavaScript:
myInfo = { name }
修改:将变量名称从dict
更改为myInfo
,因为dict
是关键字。
答案 0 :(得分:3)
不,没有。此外,这种语法不可能像构造
那样出现{name}
已保留给set
literals。
另一种选择是使用dict
constructor:
d = dict(name=name)
P.S。由于dict
是builtins
模块中定义的名称,因此请不要将变量命名为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美分。我认为这是必需的功能。