[英]Python dictionary simple way to add a new key value pair
说你有
foo = 'bar'
d = {'a-key':'a-value'}
而你想要
d = {'a-key':'a-value','foo':'bar'}
e = {'foo':foo}
我知道你可以做
d['foo'] = foo
#Either of the following for e
e = {'foo':foo}
e = dict(foo=foo)
但是,以所有这些方式将变量foo添加到dict中,我不得不两次使用foo
这个词。 一次表示密钥,一次表示其值。
对我来说两次使用foo
似乎很浪费。 有没有一种更简单的方法,您可以告诉python “将此变量添加到字典中,其名称为键,其值为值” ?
你可以做这样的事情
def add_dry_foo(d, namespace, fooName):
d[fooName] = namespace[fooName]
foo = 'oh-foo'
d = {}
add_dry_foo(d, locals(), 'foo')
print d
您可以使用:
name = 'foo'
d[name] = vars[name]
我没有看到您的d
和e
案例之间的区别:都将'foo'设置为foo的值。
如果要将其埋入函数中,将变得更加棘手:
def add_variable(d, name):
# blah
因为它随后必须使用inspect
开始在框架中四处张望。
这听起来像是一个更大的问题,如果您想向我们描述它,可能会有更好的解决方案。 例如,如果问题是您不仅仅关心foo,而是实际上关心了很多局部变量,那么您可能想要这样的东西:
d.update(locals())
它将所有局部变量的名称和值复制到d
。
实际上两次使用foo
在python程序中非常常见。 它被广泛用于传递参数,例如
def f(foo, bar):
g(foo=foo)
这是您问题中字典操作的特殊情况。
我认为没有不借助魔术就可以避免的方法,所以我认为您必须忍受它。
要将所有局部变量添加到字典中,可以执行以下操作:
d.update(locals())
对于函数调用也是如此:
func(**locals())
请注意,取决于您的位置, locals()
当然可能包含不应以字典结尾的内容。 因此,您可以实现过滤器功能:
def filtered_update(d, namespace):
for key, value in namespace.items():
if not key.startswith('__'):
d[key] = value
filtered_update(d, locals())
当然,Python的哲学是“显式胜于隐式”,因此通常我会加倍努力,并手工做这种事情(否则,您必须小心本地命名空间中发生的事情)。
如果您不想传递所有的locals()
(如果您也不完全信任要发送数据的功能,则可能会带来安全隐患),单行答案可能是:
dict([ (var, locals()[var]) for var in ['foo', 'bar'] ])
或在Python 3.0中将成为可能:
{ var: locals()[var] for var in ['foo', 'bar'] }
您可以使用eval,尽管我不确定是否会推荐它。
>>> d = dict()
>>> foo = 'wibble'
>>> def add(d, name):
d[name] = eval(name)
>>> add(d, 'foo')
>>> d
{'foo': 'wibble'}
编辑:我应该指出为什么我不建议“评估”。 如果您这样做会怎样? (摘自: http : //mail.python.org/pipermail/tutor/2005-November/042854.html )
>>> s = "(lambda loop: loop(loop)) (lambda self: self(self))"
>>> add(d, s)
Traceback (most recent call last):
File "<pyshell#54>", line 1, in <module>
add(d, s)
File "<pyshell#43>", line 2, in add
d[name] = eval(name)
File "<string>", line 1, in <module>
File "<string>", line 1, in <lambda>
File "<string>", line 1, in <lambda>
...
File "<string>", line 1, in <lambda>
RuntimeError: maximum recursion depth exceeded
在我看来,您正在谈论的是对参数传递功能的增强:
def func(*vars):
提供没有键的有序值元组
def func(**vars):
提供了键值对的字典,该值必须作为键=值对传递。
def func(***vars):
将提供键值对的字典,将其显式传递为key = value ,或隐式传递为key (变量,如果没有key = ,文字将导致错误)
所以:
(x1,x2,x3) = (1,2,3)
def myfunc(***vars):
retrun vars
myfunc(x1,x2,x3)
>>> {'x1':1,'x2':2,'x3':3}
但这当然只是一厢情愿的想法...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.