我还没有找到一种方法来解决这个问题,而不使用多个嵌套循环。问题是我正在使用Rhinoceros的几何方法在两个列表之间进行比较。基本上有一系列的行,一组开始和结束点(嵌套列表)。所有的开始和结束点都在触及线条。该脚本将最接近的行的索引与距离最近的行的索引进行比较,如果它们匹配,则返回True
。python缩短了Grasshopper中的多个嵌套循环
这是我当前的代码:
for i in range (10):
for j in range (100):
for k in range (3):
for l in range (len(linesList)):
pullSt = rc.Geometry.Curve.ClosestPoint(linesList[l], stPoint[i][j][k], 0.0001)[0]
pullEnd = rc.Geometry.Curve.ClosestPoint(linesList[l], endPoint[i][j][k], 0.0001)[0]
if pullSt == True and pullEnd == True:
match[i][j][k] = True
我想这可能与发电机表达工作,但我卡住了,因为它看起来像我实际上是在对pullSt和pullEnd值与比较之前临时存储彼此。我知道我可能超负荷我的记忆,并且必须有一个更快的方式来做到这一点,但我不知道如何。
注意:rc.Geometry.Curve.ClosestPoint返回True
如果线条与点之间的距离小于0.0001的公差,表示点在线上。
你只是希望有更少的嵌套循环?有itertools.product,会给你一个等价的迭代器'itertools.product(范围(10),范围(100),范围(3))' – hoyland
我认为itertools产品或生成器功能可能工作,但我不'不知道如何将脚本的重要部分整合到那里。关于pullSt,pullEnd等的位 –
你会保持那个位一样。 '为itertools.product(...)中的i,j,k,然后是循环的最里面部分。我理解你问的是什么吗? 你正在做的一件事是无关紧要的,就是在你找到你需要的东西后继续检查行。我可能会使用itertools折叠前三个循环,然后保持内循环,以便在找到正确的行时可以跳出它。 'pullSt'和'pullEnd'的内存可以忽略不计。你只是在一次迭代中保持它们。 – hoyland