Python 将嵌套字典的值分配给以键命名的变量

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} 我可以以某种方式创建一

我试图将嵌套字典的值分配给以其键命名的变量。我在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}

我可以以某种方式创建一个名为
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”)@MatthewKaplan
globals()
是一个类似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)