首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从python 3‘`product`’迭代器中解压由` from‘迭代器生成的值

从python 3‘`product`’迭代器中解压由` from‘迭代器生成的值
EN

Stack Overflow用户
提问于 2016-11-18 01:08:59
回答 1查看 188关注 0票数 0

我正在将一些代码从Python 2转换为Python 3。我遇到了一个问题,一些Python 2内置程序过去用于生成列表,但现在在Python 3中生成迭代器。我想重写这段代码,但没有找到一种方法使程序在不将迭代器转换为列表的情况下工作,这似乎不太有效。问题是,是否有一种方法可以让这段代码使用迭代器而不是将迭代器转换成列表?

这里是Python 3程序的简化版本。

代码语言:javascript
运行
复制
 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中,ziprange内置程序生成和迭代器。然后,来自productitertools函数创建一个基于ziprange迭代器的迭代器。

当我在Python 3中运行这段代码时,循环就会结束,而不会打印"good“,这是不准确的。代码似乎只是绕过循环,因为我认为它在pair中找不到任何值。

我找到的解决方案是将变量zips转换为一个列表。代码看起来就像。

代码语言:javascript
运行
复制
 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")

在修改后的代码中,事情可以工作,但我已经失去了漂亮的迭代器结构。

因此,问题是,我是否可以重写这段代码,而不必将迭代器转换为列表?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-18 01:16:50

与其两次将zips传递给product,不如使用repeat参数:

代码语言:javascript
运行
复制
for pair in product(zip(points, labels), repeat=2):
    ...

请注意,无论如何,product将在引擎盖下实现迭代器。它必须这样做,因为它需要迭代元素不止一次。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40667809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档