给定Python中的变量名称列表,如何创建一个变量名称为键的字典(对于变量的值)?

Dar*_*zer 14 python dictionary list

我有一个变量名列表,如下所示:

['foo', 'bar', 'baz']
Run Code Online (Sandbox Code Playgroud)

(我最初问过如何转换变量列表.请参阅下面的Greg Hewgill的答案.)

如何将其转换为字典,其中键是变量名称(作为字符串),值是变量的值?

{'foo': foo, 'bar': bar, 'baz': baz}
Run Code Online (Sandbox Code Playgroud)

现在我正在重新提出这个问题,我提出了:

d = {}
for name in list_of_variable_names:
    d[name] = eval(name)
Run Code Online (Sandbox Code Playgroud)

可以改进吗?

更新,回答问题(在评论中)为什么我想这样做:

我经常发现自己使用%运算符来设置要插入的名称和值字典的字符串.通常,字符串中的名称只是局部变量的名称.所以(下面的答案)我可以做这样的事情:

message = '''Name: %(name)s
ZIP: %(zip)s

Dear %(name)s,
...''' % dict((x, locals()[x]) for x in ['name', 'zip'])
Run Code Online (Sandbox Code Playgroud)

小智 16

忘记过滤locals()!您为格式化字符串提供的字典允许包含未使用的键:

>>> name = 'foo'
>>> zip = 123
>>> unused = 'whoops!'
>>> locals()
{'name': 'foo', 'zip': 123, ... 'unused': 'whoops!', ...}
>>> '%(name)s %(zip)i' % locals()
'foo 123'
Run Code Online (Sandbox Code Playgroud)

使用Python 3.6中的新f字符串功能,locals()不再需要使用:

>>> name = 'foo'
>>> zip = 123
>>> unused = 'whoops!'
>>> f'{zip: >5} {name.upper()}'
'  123 FOO'
Run Code Online (Sandbox Code Playgroud)

  • 如果您使用str.format()方法,请执行以下操作:`'{name} {zip}'.format(**locals())` (4认同)

Dou*_*yle 5

您可以使用列表或生成器推导来构建用于直接实例化 dict 的键、值元组列表。最好的方法如下:

dict((name, eval(name)) for name in list_of_variable_names)
Run Code Online (Sandbox Code Playgroud)

此外,例如,如果您知道变量存在于局部符号表中,则可以通过直接从局部变量中查看变量来避免危险的 eval:

dict((name, locals()[name]) for name in list_of_variable_names)
Run Code Online (Sandbox Code Playgroud)

在您最终更新后,我认为下面的答案确实是您想要的。如果您只是将它用于您控制的字符串的字符串扩展,只需将 locals() 直接传递给字符串扩展,它就会挑选出所需的值

但是,如果这些字符串可能来自外部来源(例如翻译文件),那么过滤 locals() 是个好主意