Python字典添加新键值对的简单方法

时间:2009-11-12 12:18:56

标签: python dictionary

说你有,

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 “将此变量添加到字典中,其名称为键,其值为值”

7 个答案:

答案 0 :(得分:4)

你可以做这样的事情

def add_dry_foo(d, namespace, fooName):
    d[fooName] = namespace[fooName]

foo = 'oh-foo'
d = {}
add_dry_foo(d, locals(), 'foo')
print d

答案 1 :(得分:2)

您可以使用:

name = 'foo'
d[name] = vars[name]

我看不出您的de案例之间存在差异:都将'foo'设置为foo的值。

如果你想把它埋在一个函数中,它会变得更加棘手:

def add_variable(d, name):
    # blah

因为它必须使用inspect来开始在框架中进行探索。

这听起来像一个更大的问题,如果你想向我们描述它可能有一个更好的解决方案。例如,如果问题是你不关心foo,但实际上是一大堆局部变量,那么你可能想要这样的东西:

d.update(locals())

将所有局部变量的名称和值复制到d

答案 2 :(得分:2)

实际上,使用foo两次在python程序中非常常见。它被广泛用于传递参数,例如

def f(foo, bar):
    g(foo=foo)

这是您问题中字典操作的一个特例。

我认为没有办法避免使用magic,所以我认为你必须忍受它。

答案 3 :(得分:1)

要将所有局部变量添加到dict,您可以执行以下操作:

d.update(locals())

同样适用于函数调用:

func(**locals())

请注意,根据您所在的位置locals()当然可能包含不应该在dict中结束的内容。所以你可以实现一个过滤功能:

def filtered_update(d, namespace):
    for key, value in namespace.items():
        if not key.startswith('__'):
            d[key] = value

filtered_update(d, locals())

当然,Python的哲学是“显式优于隐式”,所以一般来说,我会更加努力地手工完成这些工作(否则你必须要小心你的本地命名空间中发生了什么)。

答案 4 :(得分:1)

如果您不想传递所有locals()(如果您不完全信任您发送数据的功能可能存在安全风险),那么单行答案可能是这样:

dict([ (var, locals()[var]) for var in ['foo', 'bar'] ])

或在Python 3.0中,这将成为可能:

{ var: locals()[var] for var in ['foo', 'bar'] }

答案 5 :(得分:0)

你可以使用eval,虽然我不确定我会推荐它。

>>> d = dict()
>>> foo = 'wibble'
>>> def add(d, name):
        d[name] = eval(name)


>>> add(d, 'foo')
>>> d
{'foo': 'wibble'}

修改 我应该指出为什么我不推荐“eval”。如果你这样做会怎么样? (来自: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

答案 6 :(得分:0)

在我看来,你所谈论的是一个 增强参数传递功能:

def func(*vars):

提供没有键的有序值元组

def func(**vars):

提供键值对的字典   必须以 key = value 对传递。

def func(***vars):

将提供关键值对的字典,   明确地传递为 key = value ,   或隐含地为(变量,   文字会在没有 key = )的情况下导致错误

SO:

(x1,x2,x3) = (1,2,3)
def myfunc(***vars):
  retrun vars
myfunc(x1,x2,x3)
>>> {'x1':1,'x2':2,'x3':3}

但当然,这只是一厢情愿的想法......