理解 Python 的 itertools.chain 和 next
Posted
技术标签:
【中文标题】理解 Python 的 itertools.chain 和 next【英文标题】:Understanding Python's itertools.chain and next 【发布时间】:2018-04-21 17:51:38 【问题描述】:我正在尝试将一行 Python 代码转换为 javascript,但我对 Python 的了解有限,很难理解它。
任何人都可以尝试解释以下代码行吗? point_orientation
函数并不重要,它只是返回 True/False。
i_extend = next( ( i for i in itertools.chain(range(i_start+1, len(p)), range(0,i_start+1)) if not point_orientation( p[i-1], p[i], p[(i+1) % len(p)] ) ) )
【问题讨论】:
chain
基本上是泛化到任意迭代器的列表连接。 list(chain(list1, list2)) == list1 + list2
.
我不知道为什么这被否决了。这段代码需要python知识才能破译。它查看两个整数范围并返回第一个满足if not point_orientation
要求的整数。它使用next
完成,因此操作在第一次匹配时停止。这可以在 javascript 中通过几个 for
循环来获得不同的范围,并在每个循环中复制测试。
【参考方案1】:
这意味着“在range(i_start+1, len(p))
或range(0,i_start+1)
(如果第一个范围没有)中找到第一个元素i
,使得point_orientation( p[i-1], p[i], p[(i+1) % len(p)] )
为假”。如果没有这样的i
,就会抛出异常。
这里是更详细的 Python:
def check(i):
return point_orientation(p[i - 1],
p[i],
p[(i + 1) % len(p)])
def find_i_extend():
for i in range(i_start + 1, len(p)):
if not check(i):
return i
for i in range(0, i_start + 1):
if not check(i):
return i
i_extend = find_i_extend()
【讨论】:
【参考方案2】:chain
将两个迭代器拼接成一个。在这里,它被用来帮助模拟从特定点开始的封闭循环。观察一下
range(0, len(p)) == chain(range(0, i_start+1), range(i_start+1, len(p))
给定的代码将参数交换为chain
,以便将[0,1,2,...,10]
之类的序列转换为[5,6,...,10,0,1,...,4]
之类的序列。谓词的三个参数只是循环中的相邻项,(i+1) % len(p)
在序列末尾进行环绕。 next
仅用于获取结果序列的第一个元素。
如果您放弃尝试以单行方式表达这一点,您可能会编写以下更易于理解的代码:
n = len(p)
for i in range(i_start + 1, i_start + 1 + n):
index_before = (i - 1) % n
index_at = i % n
index_after = (i+1) % n
if not point_orientation(p[index_before], p[index_at], p[index_after])
i_extend = y
break
我们遍历单个范围,并对循环内的每个索引进行模运算。如果谓词通过,我们将i_extend
设置为当前点并突破。否则,我们继续迭代,假设 一个 点最终会成功。
【讨论】:
以上是关于理解 Python 的 itertools.chain 和 next的主要内容,如果未能解决你的问题,请参考以下文章