如果之前有人问过,请原谅我。我不知道如何搜索它。
我对以下习语非常熟悉:
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()
并使其工作方式与序列序列相同吗?如果没有,为什么?我写这篇文章时,天真地试图这样做会失败。
答案 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()))