python сократить несколько вложенных петель в Кузнечик

Я еще не могу найти способ решить эту проблему без использования нескольких вложенных циклов. Проблема в том, что я делаю сравнение между двумя списками, используя геометрический метод из Rhinoceros. В основном это список линий, набор начальной и конечной точек (вложенные списки). Все начальные и конечные точки касаются линий. Скрипт сравнивает индекс ближайшей к началу строки с ближайшей к концу строкой, и если они совпадают он возвращает True.

Это мой текущий код:

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.Геометрия.Кривая.ClosestPoint возвращаетTrue, если расстояние между линией и точкой меньше допуска 0.0001, то есть точка находится на линии.

1 ответ

  1. Этот цикл, похоже, не ссылается на что-то еще в наборе данных, и как таковой, вероятно, будет в порядке, поскольку гораздо более короткий бит кода работает на каждом объекте с помощью собственного встроенного инструментария grasshopper.

    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
    

    Если вы щелкните правой кнопкой мыши на входных данных вы можете изменить их от дерева доступа к элементу доступа.

    Это все догадка, потому что вы не сказали, какую проблему вы на самом деле пытаетесь решить.

    Если вы разместите проблему, я обновлю ответ, чтобы быть более конкретным.