解包生成字典的生成器

时间:2018-04-19 22:32:40

标签: 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

在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。

3 个答案:

答案 0 :(得分:2)

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

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

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

是苹果到橙子,这是迭代字典本身。对于在这里解压缩的等效鸭子,你需要一个在迭代时返回字典的对象

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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