2016-09-09 2 views
0

Представьте, что у вас есть список точек в 2D-пространстве. Я пытаюсь найти симметричные точки.Изменить следующий элемент списка во время итерации?

Для этого я перебираю свой список точек и применяю операции симметрии. Поэтому предположим, что я применяю одну из этих операций к первой точке, и после этой операции она равна другой точке в списке. Эти 2 точки симметричны.

Так что я хочу, чтобы стереть эту другую точку из списка, который я повторяю, таким образом, моя итерационная переменная say «i» не примет это значение. Потому что я уже знаю, что он симметричен с первой точкой.

Я видел похожие Должности, но они удаляют значение в списке, который они уже сделали. Я хочу удалить последующие значения.

+0

У вас может быть отдельный список или установить сохранение найденных точек и проверить, не «если не в», когда вы итерации. – garg10may

+0

, пожалуйста, напишите, что вы пробовали до сих пор? – garg10may

ответ

1

В общем, это плохая идея удалить значения из списка, который вы итерируете. Есть, однако, еще один способ пропустить симметричные точки. Например, вы можете проверить для каждой точки, если вы увидели симметричный один перед:

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 
+0

имеет линейную сложность. – garg10may

+0

@ garg10may Я думаю, что это даже квадратично, но я не уверен, что есть более быстрый способ. Хуже всего, когда нет симметричных точек, поэтому для каждой точки вам нужно проверить весь список. Лучший случай - все точки симметричны, а затем мое решение линейно. –

1

Независимо от симметричных точек оказываются Правда добавить их в набор, поскольку набор содержит уникальные элементы и посмотреть это O(1) вы можете использовать, если point not in set состояние.

if point not in s: 
    #test for symmetry 
    if symmetric: 
     s.add(point) 
Смежные вопросы