分配给词典

时间:2010-09-29 14:23:36

标签: python dictionary

如果之前有人问过,请原谅我。我不知道如何搜索它。

我对以下习语非常熟悉:

def foo():
    return [1,2,3]

[a,b,c] = foo()
(d,e,f) = foo()

其中左侧包含的值将根据右侧函数返回的值进行分配。

我也知道你可以做到

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

(one, two, three) = bar()
[four, five, six] = bar()

其中从右侧返回的键将被分配给左侧的容器。

但是,我很好奇,有没有办法在Python 2.6或更早版本中执行以下操作:

{letterA:one, letterB:two, letterC:three} = bar()

并使其工作方式与序列序列相同吗?如果没有,为什么?我写这篇文章时,天真地试图这样做会失败。

3 个答案:

答案 0 :(得分:4)

字典项目没有订单,所以虽然这样做有效:

>>> def bar():
...     return dict(a=1,b=2,c=3)
>>> bar()
{'a': 1, 'c': 3, 'b': 2}
>>> (lettera,one),(letterb,two),(letterc,three) = bar().items()
>>> lettera,one,letterb,two,letterc,three
('a', 1, 'c', 3, 'b', 2)

您可以看到,您无法预测变量的分配方式。您可以使用Python 3中的collections.OrderedDict来控制它。

答案 1 :(得分:1)

如果修改bar()以返回dict(如@mikerobi所建议的那样),您可能仍希望保留现有dict中的键控项。在这种情况下,请使用update:

mydict = {}
mydict['existing_key'] = 100

def bar_that_says_dict():
    return { 'new_key': 101 }

mydict.update(bar_that_says_dict())

print mydict

这应该输出带有existing_key和new_key的dict。如果mydict有一个new_key的键,那么更新将使用bar_that_says_dict返回的值覆盖它。

答案 2 :(得分:-1)

不,如果你不能改变条形函数,你可以很容易地从输出创建一个字典。

这是最紧凑的解决方案。但我更愿意修改bar函数以返回dict

dict(zip(['one', 'two', 'three'], bar()))