Python 在迭代过程中更改下一个列表元素?
假设您在二维空间中有一个点列表。我试图找到对称点 为此,我迭代我的点列表并应用对称操作。所以假设我对第一个点应用其中一个操作,在这个操作之后,它等于列表中的另一个点。这两点是对称的 所以我想从我正在迭代的列表中删除另一个点,这样我的迭代变量“I”就不会取这个值。因为我已经知道它和第一个点是对称的Python 在迭代过程中更改下一个列表元素?,python,python-2.7,loops,iterator,Python,Python 2.7,Loops,Iterator,假设您在二维空间中有一个点列表。我试图找到对称点 为此,我迭代我的点列表并应用对称操作。所以假设我对第一个点应用其中一个操作,在这个操作之后,它等于列表中的另一个点。这两点是对称的 所以我想从我正在迭代的列表中删除另一个点,这样我的迭代变量“I”就不会取这个值。因为我已经知道它和第一个点是对称的 我也看到过类似的帖子,但它们删除了列表中已经包含的一个值。我想要的是删除后续的值。一般来说,从正在迭代的列表中删除值是个坏主意。但是,还有其他方法可以跳过对称点。例如,如果以前见过对称点,则可以检查每个
我也看到过类似的帖子,但它们删除了列表中已经包含的一个值。我想要的是删除后续的值。一般来说,从正在迭代的列表中删除值是个坏主意。但是,还有其他方法可以跳过对称点。例如,如果以前见过对称点,则可以检查每个点:
for i, point in enumerate(points):
if symmetric(point) not in points[:i]:
# Do whatever you want to do
这里symmetric
根据对称操作生成一个点。如果对称操作连接两个以上的点,则可以执行以下操作:
for i, point in enumerate(points):
for sympoint in symmetric(point):
if sympoint in points[:i]:
break
else:
# Do whatever you want to do
一般来说,从正在迭代的列表中删除值是个坏主意。但是,还有其他方法可以跳过对称点。例如,如果以前见过对称点,则可以检查每个点:
for i, point in enumerate(points):
if symmetric(point) not in points[:i]:
# Do whatever you want to do
这里symmetric
根据对称操作生成一个点。如果对称操作连接两个以上的点,则可以执行以下操作:
for i, point in enumerate(points):
for sympoint in symmetric(point):
if sympoint in points[:i]:
break
else:
# Do whatever you want to do
无论对称点结果如何,都将它们添加到集合中,因为集合维护唯一的元素,并且查找是
O(1)
,如果点不在集合中,则可以使用
if point not in s:
#test for symmetry
if symmetric:
s.add(point)
无论对称点结果如何,都将它们添加到集合中,因为集合维护唯一的元素,并且查找是O(1)
,如果点不在集合中,则可以使用
if point not in s:
#test for symmetry
if symmetric:
s.add(point)
您可以有一个单独的列表或集合来维护找到的点,并在每次迭代时检查(如果不在
中)。请发布您迄今为止尝试过的内容?您可以有一个单独的列表或集合来维护找到的点,并在每次迭代时检查(如果不在
中)。请发布您迄今为止尝试过的内容?这有一个线性关系复杂性。@garg10我认为它甚至是二次的,但我不确定有没有更快的方法。最糟糕的情况是没有对称点,因此对于每个点,您必须测试整个列表。最好的情况是所有的点都是对称的,然后我的解是线性的。这有一个线性的复杂性。@garg10我可能认为它甚至是二次的,但我不确定有没有更快的方法。最糟糕的情况是没有对称点,因此对于每个点,您必须测试整个列表。最好的情况是所有的点都是对称的,然后我的解是线性的。