在嵌套迭代期间更改迭代顺序



给定两个关联数组,一个数组包含指向 3d 点坐标的指针,另一个数组包含表面的哈希/字典。对于第一个数组中的每个点,在第二个数组(点位于曲面上的位置)中将只找到一个匹配的表面。

我们需要遍历这些点以找到匹配的表面(然后获得在该点垂直于表面的单位向量 [ijk 点]。

暴力破解可以遍历每个列表中的每个项目,一旦找到每个表面数据点,就会中断迭代。虽然我已经在编写该程序的早期版本时发现,将执行天文数字的大量计算,我需要高效。

点总是比表面多,并且表面将是相邻的,这意味着当我按特定顺序迭代这些点时,下一个点更有可能与最后一个点位于同一表面上。

我想知道我是否可以运行一个循环,例如,

for point n:for surface i:
does the point lay on the surface? if so, break
...如果最后一个"i"值是 5,则在 i=5 处开始下一次迭代(如果该点不在曲面 5 上,请继续遍历每个曲面。如果我能让它按这样的顺序迭代会更好:不是 5?尝试 6;不是6?尝试4—— 扩展这个想法,假设"i"被组织在一个 2D 数组中。即: [1,2,3] [4,5,6] [7,8,9]


对于 n 点:
对于 i 表面:(从我离开的地方继续,)不是 4?尝试 2;不是2?尝试 8.

我想知道"for"循环是否会给我所需的多功能性。(顺便说一下,该程序可能会用Python或.NET编写)我想我可以做一个while循环并编写某种逻辑,以我想要的方式迭代。我是在尝试重新发明轮子吗?我走在正确的轨道上吗?

这只是部分答案,因为您的问题没有很多关于实际代码的细节。 但是,也就是说,需要注意的一件事是,即使在循环结束后,来自for循环的变量仍保留其值。 所以这将打印 5:

for i in range(1000):
if i == 5:
break
print(i)

因此,您可以在内部循环后轻松检查它结束的值。 然后你可以用这个值做任何你想做的事情。 例如,您可以在下一次通过外部循环时查看它并修复内容,以便内部循环从其他地方开始。

for循环几乎肯定会为您提供所需的多功能性,因为您可以使用 for 循环来迭代多种内容,包括您创建的一些自定义迭代器。 例如,您可以执行以下操作:

def best_order_to_loop(all_surfaces, previous_stopping_point):
# some logic here
yield next_value
previous_stopping_point = None
for point in points:
surfaces_in_order = best_order_to_loop(all_surfaces, previous_stopping_point)
for surface in surfaces_in_order:
# do whatever
previous_stopping_point = surface

同样,这只是一个草图,我不确定我是否 100% 理解您的设置。 但似乎你在说"如果前一个循环在 X 处停止,那么基于此,我希望下一个循环以这样那样的顺序循环"。 如果是这种情况,您可以编写一个像best_order_to_loop这样的函数,根据之前的停止点确定下一个内部循环将如何进行。

最新更新