Python 分配给听写者

Python 分配给听写者,python,dictionary,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() 其中,从右侧返回的钥匙将分配给左侧的容器

如果以前有人问过,请原谅我。我不知道如何寻找它

我很熟悉下面这个成语:

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()
其中,从右侧返回的钥匙将分配给左侧的容器

但是,我很好奇,在Python2.6或更早版本中,是否有一种方法可以执行以下操作:

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

它的工作方式是否与序列到序列的工作方式相同?若否,原因为何?天真地尝试按我写的那样做会失败。

不,如果您不能更改bar函数,您可以很容易地从输出创建dict

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

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

字典项没有顺序,因此,在执行此操作时:

>>> 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来控制此操作。

如果您修改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

这将输出一个既有_键又有新_键的dict。如果mydict有一个new_key的键,那么更新会用bar_返回的值覆盖它,bar_返回的值表示\u dict.

+1,我想强调“您不一定能预测变量将如何分配”部分!我认为他们否决了您,因为您的解决方案只捕获bar函数返回的字典的键,但将它们分配给生成的字典的值。不过,我没有投你反对票,所以我只是猜测。