Ich kann noch keinen Weg finden, dieses Problem zu lösen, ohne mehrere verschachtelte Schleifen zu verwenden. Das Problem ist, dass ich einen Vergleich zwischen zwei Listen unter Verwendung einer geometrischen Methode von Rhinoceros mache. Grundsätzlich gibt es eine Liste von Linien, eine Reihe von Start- und Endpunkten (verschachtelte Listen). Alle Start- und Endpunkte berühren die Linien. Das Skript vergleicht den Index der nächsten Zeile mit dem Anfang mit der nächsten Zeile bis zum Ende, und wenn sie übereinstimmen, wird True
zurückgegeben.Python verkürzen mehrere verschachtelte Schleifen in Grasshopper
Dies ist mein aktueller Code:
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
Ich dachte, es mit einem Generator Ausdruck funktionieren könnte, aber ich blieb stecken, weil es scheint, wie ich eigentlich vorübergehend zu speichern, die die pullSt und pullEnd Werte vor mit Vergleich gegenseitig. Ich weiß, dass ich wahrscheinlich mein Gedächtnis überlasten muss und es muss einen schnelleren Weg geben, dies zu tun, aber ich bin mir nicht sicher, wie.
HINWEIS: rc.Geometry.Curve.ClosestPoint gibt True
zurück, wenn der Abstand zwischen der Linie und dem Punkt kleiner als die Toleranz von 0,0001 ist. Dies bedeutet, dass der Punkt auf der Linie liegt.
Sie hoffen nur, weniger verschachtelte Schleifen zu haben? Es gibt itertools.product, das Ihnen einen äquivalenten Iterator mit 'itertools.product (Bereich (10), Bereich (100), Bereich (3))' – hoyland
Ich denke, entweder itertools Produkt oder eine Generator-Funktion könnte funktionieren, aber ich nicht ' Ich weiß, wie man den wichtigen Teil des Skripts darin integriert. Das bisschen über pullSt, pullEnd, etc. –
Du würdest das bisschen gleich behalten. 'für i, j, k in itertools.product (...)' und dann der innerste Teil Ihrer Schleife. Verstehe ich, was Sie richtig fragen? Eine Sache, die Sie tun, ist irrelevant ist weiter zu prüfen, Linien, nachdem Sie die eine, die Sie brauchen gefunden haben. Ich könnte die ersten drei Schleifen mit itertools reduzieren und dann die innere Schleife beibehalten, damit Sie ausbrechen können, wenn Sie die richtige Linie finden. Der Speicher der 'pullSt' und' pullEnd' ist vernachlässigbar. Sie behalten sie nur für eine Iteration bei. – hoyland