Python 解包生成字典的生成器
我无法理解以下示例代码的输出:Python 解包生成字典的生成器,python,python-2.7,generator,iterable-unpacking,Python,Python 2.7,Generator,Iterable Unpacking,我无法理解以下示例代码的输出: def g1(): d = {'a':1, 'b':2, 'c':3} yield d for a,b,c in g1(): print a,b,c 在Python2.7.14中,上述内容将打印出来 a c b 这种行为有两个有趣的方面: 它打印出排序后的abc的acb整数,这应该是这样的,因为我们讨论的是字典键 如果只定义字典而不编写生成器d={'a':1,'b':2,'c':3},然后在d:中为a,b,c编写,这将是一个值错误 1
def g1():
d = {'a':1, 'b':2, 'c':3}
yield d
for a,b,c in g1():
print a,b,c
在Python2.7.14中,上述内容将打印出来
a c b
这种行为有两个有趣的方面:
abc
的acb
整数,这应该是这样的,因为我们讨论的是字典键d={'a':1,'b':2,'c':3}
,然后在d:中为a,b,c编写,这将是一个值错误
2.
对于d中的a、b、c:
将给您一个错误,因为您试图将字典中的键解压为三个变量,这是行不通的。但是,您可以对d.items()中的a、b执行,因为它返回一个元组对列表。第一点:在Python2.7中,dict根本没有顺序。在3.7+之前不要依赖它
第二点:生成器g1()
在迭代时生成字典。拟议的备选方案:
for a,b,c in d:
...
是苹果对橙子,这是字典本身的迭代。对于要在此处解包的等效duck,您需要一个在迭代时返回字典的对象:
科林的回答基本上回答了你的问题。但是,如果您想解决无序列表的第一个问题,请尝试使用集合
库下的内置类OrderedDict
。字典在Python中不排序。无论如何,在Python 2.7中也不排序。键按插入顺序返回,作为3.6中的CPython实现细节,并将作为从3.7开始的语言保证。这意味着a,b,c=d
,其中d
是如上定义的字典,将是一项法律声明,将d
的键分配给变量a
,b
,和c
。如果d
是一个列表,则行为类似。这对我来说是个惊喜。
for a,b,c in [d]:
...