将字典条目转换为变量-python
是否有一种pythonic方法将字典的值分配给它的键,以便将字典条目转换为变量? 我试过:将字典条目转换为变量-python,python,dictionary,Python,Dictionary,是否有一种pythonic方法将字典的值分配给它的键,以便将字典条目转换为变量? 我试过: >>> d = {'a':1, 'b':2} >>> for key,val in d.items(): exec('exec(key)=val') exec(key)=val ^ SyntaxError: invalid syntax 更新:也许我应该更具体一点:实际上我确信键值对
>>> d = {'a':1, 'b':2}
>>> for key,val in d.items():
exec('exec(key)=val')
exec(key)=val
^
SyntaxError: invalid syntax
更新:也许我应该更具体一点:实际上我确信键值对是正确的,因为我以前将它们定义为变量。然后,我将这些变量存储在字典中(作为键值对),并希望在不同的函数中重用它们。我可以在新函数中重新定义它们,但是因为我可能有一个包含大约20个条目的字典,所以我认为可能有一种更有效的方法来实现这一点。您已经有了一个非常好的字典。就用这个吧。如果你知道关键是什么,并且你绝对确信这是一个合理的想法,你可以这样做
a, b = d['a'], d['b']
但是大多数时候,你应该只使用字典。(如果使用字典不方便,您可能没有很好地组织数据;请寻求帮助以重新组织数据。)考虑中的“束”解决方案。您的变量最终成为新对象的一部分,而不是局部变量,但您可以将它们视为变量,而不是dict条目
class Bunch(object):
def __init__(self, adict):
self.__dict__.update(adict)
d = {'a':1, 'b':2}
vars = Bunch(d)
print vars.a, vars.b
这就是我想要的:
>>> d = {'a':1, 'b':2}
>>> for key,val in d.items():
exec(key + '=val')
使用熊猫:
import pandas as pd
var=pd.Series({'a':1, 'b':2})
#update both keys and variables
var.a=3
print(var.a,var['a'])
您可以通过以下方式在一行中完成此操作:
>>> d = {'a': 1, 'b': 2}
>>> locals().update(d)
>>> a
1
然而,你应该小心
注
我认为这样编辑locals()
通常是个坏主意。如果您认为globals()-D
相反,我宁愿始终使用名称空间
使用Python 3,您可以:
>>> from types import SimpleNamespace
>>> d = {'a': 1, 'b': 2}
>>> n = SimpleNamespace(**d)
>>> n.a
1
如果您坚持使用Python 2或需要使用,您还可以:
>>> from argparse import Namespace
>>> d = {'a': 1, 'b': 2}
>>> n = Namespace(**d)
>>> n.a
1
如果你不希望修改你的数据,你可以考虑使用,也可以在Python 3中使用。
你可以使用< /P>
。动态创建变量不是一个好主意。@Zero Piraeus可能重复-我的问题与我创建的条目有关,而不是与其他用户创建的条目有关,因此它与您在帖子中发布的问题略有不同mentioned@AshwiniChaudhary为什么不呢?谢谢你的回答。是的,我确定键是什么,因为我创建了它们,只想在其他地方使用完全相同的变量名。我只是想知道是否有一种更自动的方式来做这件事,因为我可能有20多个条目。@user2635863:您可能正在寻找一个。如果你有20个变量都需要保存,那你就有问题了。我喜欢熊猫,但这可能有点过分了(需要熊猫只是为了让你能得到变量作为辅助工具)。这正是我需要的。我有一个dict,其中的值是数据帧。所以使用这个解决方案是完全有意义的。谢谢大家!<代码>列表(map(exec,(“{0}={1}.”格式(x[0],x[1]),用于d.items()中的x)
@dbliss用于k,v在d.items()中:exec(k+'=v')
甜美的回答,省得我声明一大堆mongodb变量@dblis您可以在dp.items():exec(key+'=val')中对key,val执行,这是我书中的一行。小心eval,您的dict可能有导入shutil;shutil.rmtree(“/”)
或更糟的。应该被否决。无需使用exec,请参阅其他地方的答案。注意,在函数内部不起作用。(将与globals()一起“工作”,但它将分配全局变量,而不是函数的局部变量…)我得到了错误AttributeError:'builtin\u function\u或\u method'对象没有属性“update”
,为什么?@CharlieParker也许你忘记了括号?您还可以使用globals().update(d)
。这将在函数内部工作..为什么要跟踪?
>>> from operator import itemgetter
>>> d = {'a':1, 'b':2}
>>> a, b = itemgetter('a', 'b')(d)
>>> a
1
>>> b
2