2016-04-30 17 views
0

我還沒有找到一種方法來解決這個問題,而不使用多個嵌套循環。問題是我正在使用Rhinoceros的幾何方法在兩個列表之間進行比較。基本上有一系列的行,一組開始和結束點(嵌套列表)。所有的開始和結束點都在觸及線條。該腳本將最接近的行的索引與距離最近的行的索引進行比較,如果它們匹配,則返回Truepython縮短了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的公差,表示點在線上。

+0

你只是希望有更少的嵌套循環?有itertools.product,會給你一個等價的迭代器'itertools.product(範圍(10),範圍(100),範圍(3))' – hoyland

+0

我認爲itertools產品或生成器功能可能工作,但我不'不知道如何將腳本的重要部分整合到那裏。關於pullSt,pullEnd等的位 –

+0

你會保持那個位一樣。 '爲itertools.product(...)中的i,j,k,然後是循環的最裏面部分。我理解你問的是什麼嗎? 你正在做的一件事是無關緊要的,就是在你找到你需要的東西后繼續檢查行。我可能會使用itertools摺疊前三個循環,然後保持內循環,以便在找到正確的行時可以跳出它。 'pullSt'和'pullEnd'的內存可以忽略不計。你只是在一次迭代中保持它們。 – hoyland

回答

0

這個循環似乎並沒有引用數據集中的其他任何東西,因此可能是好的,因爲使用蚱蜢自己的內置工具可以在每個對象上工作的代碼少得多。

pullSt = rc.Geometry.Curve.ClosestPoint(linesList[l], stPoint, 0.0001)[0] 
pullEnd = rc.Geometry.Curve.ClosestPoint(linesList[l], endPoint, 0.0001)[0] 
if pullSt == True and pullEnd == True: 
    match = True 

如果您右鍵單擊輸入,您可以將它們從樹訪問更改爲項訪問。

這是因爲,雖然你沒有說你實際上是試圖解決什麼問題的所有猜測。

如果您發佈該問題,我會更新答案以更具體。