一次将Python dict的内容分配给多个变量?

时间:2012-06-23 22:48:08

标签: python dictionary

我想做这样的事情

def f():
    return { 'a' : 1, 'b' : 2, 'c' : 3 }

{ a, b } = f()     # or { 'a', 'b' } = f() ?

即。这样a得到1,b得2,c未定义

这与此类似

def f()
    return( 1,2 )

a,b = f()

6 个答案:

答案 0 :(得分:8)

根据变量名称解压缩没有任何意义。你能得到的最接近的是:

a, b = [f()[k] for k in ('a', 'b')]

当然,这会两次评估f()


你可以写一个函数:

def unpack(d, *keys)
    return tuple(d[k] for k in keys)

然后做:

a, b = unpack(f(), 'a', 'b')

但这实在是太过分了。简单的事情会更好:

result = f()
a, b = result['a'], result['b']

答案 1 :(得分:5)

考虑将f设为namedtuple然后您可以直接使用f.af.b

答案 2 :(得分:3)

嗯。奇怪的是因为字典没有排序,所以值解包依赖于变量名。但是,如果丑陋的话,这是可能的:

>>> locals().update(f())
>>> a
1

不要在家尝试这个!这是一个可维护性的噩梦。但也有点酷: - )

答案 3 :(得分:0)

您可以使用(或滥用)函数属性来执行此操作:

>>> def f():
...    f.a=1
...    f.b=2
...    return { 'a' : f.a, 'b' : f.b, 'c' : 3 }
... 
>>> f()
{'a': 1, 'c': 3, 'b': 2}
>>> a,b=f.a,f.b
>>> a,b
(1, 2)

请注意,在调用f()或手动分配f()之后,属性才有值。

我(很少)使用函数属性作为C的static类变量的填充,如下所示:

>>> def f(i):
...    f.static+=i
...    return f.static
>>> f.static=0
>>> f(1)
1
>>> f(3)
4

有更好的方法可以做到这一点,但只是为了完成......

答案 4 :(得分:0)

尝试使用Python的内置iter():

>>> def f():
...   return( 1,2 )
>>> a,b = iter(f())
>>> a
1

答案 5 :(得分:0)

mydict = {'aa':2, 'bb':'john', 'cc':34, 'dd':'bye'}

a, b, c, d = [mydict[k] for k in ['aa', 'bb', 'cc', 'dd']]