解包生成字典的生成器
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
这种行为有两个有趣的方面:
- 它打印出
a c b
而不是排序后的 a b c
,因为我们正在谈论字典键,所以应该是这种情况。
- 如果你只是定义字典而不写生成器
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
。
我无法理解以下示例代码的输出:
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
这种行为有两个有趣的方面:
- 它打印出
a c b
而不是排序后的a b c
,因为我们正在谈论字典键,所以应该是这种情况。 - 如果你只是定义字典而不写生成器
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
。