我還沒有找到一種方法來解決這個問題,而不使用多個嵌套循環。問題是我正在使用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