解包生成字典的生成器

Unpacking generator which yields a dictionary

我无法理解以下示例代码的输出:

def g1():
    d = {'a':1, 'b':2, 'c':3}
    yield d

for a,b,c in g1():
    print a,b,c

在Python 2.7.14中,上面的会打印出来

a c b

这种行为有两个有趣的方面:​​

  1. 它打印出 a c b 而不是排序后的 a b c,因为我们正在谈论字典键,所以应该是这种情况。
  2. 如果你只是定义字典而不写生成器d = {'a':1, 'b':2, 'c':3},然后for a,b,c in d:,这将是一个valueError。

1.) 在Python 2.7中,字典是无序的。

2.) for a,b,c in d: 会给你一个错误,因为你试图将字典的键解压成三个变量,这是行不通的。但是,您可以 for a, b in d.items() 因为它是 returns 元组对列表。

第一点: 字典在 Python 2.7 中根本没有排序。 3.7+之前不要依赖它。

第二点:生成器g1()迭代时,生成字典。建议的备选方案:

for a,b,c in d:
    ...

is apples to oranges,这是迭代字典本身。对于要在此处解压的等效鸭子,您将需要 一个对象,该对象在迭代时 returns 是一个字典 :

for a,b,c in [d]:
    ...

Colin 的回答几乎回答了您的问题。但是如果你想用无序列表解决你的第一个问题,请尝试使用 collections 库下的内置 class OrderedDict