繁体   English   中英

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

[英]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]

我没有看到您的de案例之间的区别:都将'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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM