2016-04-30 116 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 

如果您右键单击输入,您可以将它们从树访问更改为项访问。

这是因为,虽然你没有说你实际上是试图解决什么问题的所有猜测。

如果您发布该问题,我会更新答案以更具体。