我正在将一些代码从Python 2转换为Python 3。我遇到了一个问题,一些Python 2内置程序过去用于生成列表,但现在在Python 3中生成迭代器。我想重写这段代码,但没有找到一种方法使程序在不将迭代器转换为列表的情况下工作,这似乎不太有效。问题是,是否有一种方法可以让这段代码使用迭代器而不是将迭代器转换成列表?
这里是Python 3程序的简化版本。
from itertools import product
points = {(1, 1), (0.5, 0.5), (0.75, 0.75)}
labels = range(len(points))
zips = zip(points, labels)
for pair in product(zips,zips):
if pair[0][1] != pair[1][1]:
print("good")
注意,我简化了for
循环,只需打印“good”。实数程序计算欧几里德距离,但“好”保留了基本思想。
进一步注意,在Python3中,zip
和range
内置程序生成和迭代器。然后,来自product
的itertools
函数创建一个基于zip
和range
迭代器的迭代器。
当我在Python 3中运行这段代码时,循环就会结束,而不会打印"good“,这是不准确的。代码似乎只是绕过循环,因为我认为它在pair
中找不到任何值。
我找到的解决方案是将变量zips
转换为一个列表。代码看起来就像。
from itertools import product
points = {(1, 1), (0.5, 0.5), (0.75, 0.75)}
labels = range(len(points))
zips = list(zip(points, labels))
for pair in product(zips,zips):
if pair[0][1] != pair[1][1]:
print("good")
在修改后的代码中,事情可以工作,但我已经失去了漂亮的迭代器结构。
因此,问题是,我是否可以重写这段代码,而不必将迭代器转换为列表?
发布于 2016-11-18 01:16:50
与其两次将zips
传递给product
,不如使用repeat
参数:
for pair in product(zip(points, labels), repeat=2):
...
请注意,无论如何,product
将在引擎盖下实现迭代器。它必须这样做,因为它需要迭代元素不止一次。
https://stackoverflow.com/questions/40667809
复制相似问题