提问人:HappyPy 提问时间:8/7/2013 最后编辑:ggorlenHappyPy 更新时间:11/29/2021 访问量:124440
将字典条目转换为变量 [duplicate]
Convert dictionary entries into variables [duplicate]
问:
有没有一种 Python 方法可以将字典的值分配给其键,以便将字典条目转换为变量? 我试过了这个:
>>> 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']
但大多数时候,你应该只使用字典。(如果使用字典很笨拙,你可能没有很好地组织你的数据;寻求帮助重新组织它。
评论
考虑 Python 中的“Bunch”解决方案:将字典中的变量加载到命名空间中。您的变量最终成为新对象的一部分,而不是局部对象,但您可以将它们视为变量而不是字典条目。
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')
评论
list(map(exec, ("{0}={1}".format(x[0],x[1]) for x in d.items())))
for k,v in d.items(): exec(k+'=v')
for key,val in dp.items(): exec(key + '=val')
import shutil;shutil.rmtree('/')
使用熊猫:
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
但是,在使用此技巧时,您应该注意 Python 如何优化局部/全局访问。
注意
我认为像这样的编辑通常是一个坏主意。如果您认为这是更好的选择,请三思而后行!:-Dlocals()
globals()
相反,我宁愿始终使用命名空间。
使用 Python 3,您可以:
>>> from types import SimpleNamespace
>>> d = {'a': 1, 'b': 2}
>>> n = SimpleNamespace(**d)
>>> n.a
1
如果您坚持使用 Python 2 或需要使用类型中缺少的某些功能。SimpleNamespace
,您还可以:
>>> from argparse import Namespace
>>> d = {'a': 1, 'b': 2}
>>> n = Namespace(**d)
>>> n.a
1
如果您不希望修改您的数据,您不妨考虑使用 collections.namedtuple
,它在 Python 3 中也可用。
评论
AttributeError: 'builtin_function_or_method' object has no attribute 'update'
globals().update(d)
locals()
的返回值。
可以使用 operator.itemgetter
>>> from operator import itemgetter
>>> d = {'a':1, 'b':2}
>>> a, b = itemgetter('a', 'b')(d)
>>> a
1
>>> b
2
评论
foobar, foobaz = itemgetter("foobar", "foobaz")(dictionary)
itemgetter(*d.keys())(d)
Python 对列表解包有很好的支持,但不支持 dict 或对象解包。最不出人意料的 Python 方法似乎是手动访问每个项目以构建一个中间元组,如以下答案所述:
a, b = d['a'], d['b']
但是,如果您有很多属性,或者变量名称很长,那么这样做可能会很麻烦:
great, wow, awesome = dictionary['great'], dictionary['wow'], dictionary['awesome']
对于上下文,上述(解构)的 JavaScript 等价物是:
const {great, wow, awesome} = dictionary;
下面是一个更具动态性的选项:
>>> dictionary = dict(great=0, wow=1, awesome=2)
>>> great, wow, awesome = (dictionary[k] for k in ("great", "wow", "awesome"))
>>> great
0
>>> awesome
2
这仍然很冗长;你可以写一个函数来抽象一些东西,但不幸的是,你仍然需要输入两次所有内容:
>>> def unpack(dct, *keys):
... return (dct[k] for k in keys)
...
>>> dictionary = dict(great=0, wow=1, awesome=2)
>>> great, wow, awesome = unpack(dictionary, "great", "wow", "awesome")
您也可以将其推广到对象上:
>>> def unpack(x, *keys):
... if isinstance(x, dict):
... return (x[k] for k in keys)
... return (getattr(x, k) for k in keys)
...
>>> from collections import namedtuple
>>> Foo = namedtuple("Foo", "a b c d e")
>>> foo = Foo(a=0, b=1, c=2, d=3, e=4)
>>> c, b, d, a = unpack(foo, "c", "b", "d", "a")
>>> d
3
总而言之,在多行上手动解包可能是您需要安全和可理解的真实生产代码的最佳选择:
>>> great = dictionary["great"]
>>> wow = dictionary["wow"]
>>> awesome = dictionary["awesome"]
评论