Python 将嵌套字典的值分配给以键命名的变量
我试图将嵌套字典的值分配给以其键命名的变量。我在Stackoverflow上找到了这段代码,但它只打印密钥和值对:Python 将嵌套字典的值分配给以键命名的变量,python,dictionary,Python,Dictionary,我试图将嵌套字典的值分配给以其键命名的变量。我在Stackoverflow上找到了这段代码,但它只打印密钥和值对: def myprint(d): for k, v in d.items(): if isinstance(v, dict): myprint(v) else: print("{0} : {1}".format(k, v)) 例如,如果我的字典中有以下内容:{thisIsADummy:37} 我可以以某种方式创建一
def myprint(d):
for k, v in d.items():
if isinstance(v, dict):
myprint(v)
else:
print("{0} : {1}".format(k, v))
例如,如果我的字典中有以下内容:
{thisIsADummy:37}
我可以以某种方式创建一个名为thisIsADummy
的变量,该变量以键命名,值为37
因此,我的输入应该是print(thisIsADummy)
,输出应该是37
请让我知道,如果有人有任何想法,如何尽可能有效地做到这一点,因为这本字典可能有一千多对。多谢各位
编辑:
使用exec
效果很好,但我在最初的帖子中过于简化了。我需要将变量设置为字典,以便在打开多个文件时可以附加值。避免使用eval()
,请尝试setattr
(我不确定这是否是更好的方法):
结果:
37 [123, 2, 1]
基本思想是使用“exec”函数,如下所示
nat = {
'abc': 1,
'a123': 2,
'a1b': 3,
'b31': 4
}
for k, v in nat.items():
exec("%s = %d" % (k, v))
print(k, v)
print(abc, a123, a1b, b31)
注意:只有当键遵循变量名约束时,它才会起作用。您不应该这样做:如上所述,这应该起作用。
globals()。更新(字典)
,因为globals()
只是一个dict,您可以像dict@IainShelvington我不明白这是怎么回事我想exec就是我想的,不是评估。这也是一个坏主意,exec(“x=3”)@MatthewKaplanglobals()
是一个类似dict的对象,包含所有当前全局变量。这个globals对象是可变的,因此您可以不执行a=1
而执行globals()['a']=1
。但是我强烈建议不要这样做,因为这会使你的代码难以推理,并且可能会遇到奇怪和意外的问题{thisIsADummy:37}
,如果是{“thisIsADummy”:37}
?不幸的是,我过于简化了我的原始帖子,因为我认为这没有多大意义,但是我实际上要打开多个文件,这样如果变量是一个列表,那么我就可以附加值。“你有什么想法可以最好地做到这一点吗?”@MatthewKaplan如果你的值是一个列表就可以了。我该如何附加值?原始变量是一个int。愚蠢的Jupyter笔记本存储了该变量<代码>用于t.items()中的k,v:exec(f'{k}=v')@GauravVijayvargia感谢您的建议。它实际上可以工作并保存在一个变量中,这是非常好的。不幸的是,我过于简化了我的原始帖子,因为我认为这没什么大不了的,但是我实际上要打开多个文件,这样如果变量是一个列表,那么我就可以附加值了。你知道如何最好地做到这一点吗?@MatthewKaplan如果我正确理解你的问题,那么这将有助于“exec”(%s=[%d]“%(k,v))”。它将创建键字符串作为列表variable@GauravVijayvargia很遗憾,这对我不起作用,因为该值并不总是整数%d只接受整数。有没有办法改变它,让它接受所有类型?实际上,我只是使用了exec('k=v')
,之前它对我很有用。如果我只使用int,这将非常有效。@MatthewKaplan请尝试“exec(“%s=['%s']]”(k,v))”。
nat = {
'abc': 1,
'a123': 2,
'a1b': 3,
'b31': 4
}
for k, v in nat.items():
exec("%s = %d" % (k, v))
print(k, v)
print(abc, a123, a1b, b31)