0

У меня есть структуры данных линия, контур:Удаление данных из списка внутри двух петель для

class Line : 
    x1 
    y1 
    x2 
    y2 
    m 
    c 
    id 
    # other functions pertaining to the class 

В главном цикле у меня есть список строк, которые уже заселенных в этой точке.

То, что я хочу сделать, это объединить строки, которые имеют т и с значением очень близко, так что я получить одну строку вместо нескольких линий от обнаружения

for line1 in allLines: 
    consolidateLines = [] 
    for line2 in allLines: 
     if line1.id() == line2.id(): 
      continue; 
     if abs(line1.m() - line2.m()) < SomeValue: 
      if abs(line1.c() - line2.c()) < someOtherValue: 
       consolidateLines.append(line2); 
    consolidateLines.append(line1); 
    # I want to remove all the lines in consolidatedLines. 
    # But since this is already in the loop, that is a problem. 
    # How do I accomplish this. 

Объясняя проблему: У меня есть список строк. Поскольку эти линии обнаруживаются с использованием алгоритма компьютерного зрения (Hough Transforms), некоторые линии очень близки друг к другу. Это не идеально. Поэтому я пытаюсь консолидировать все линии, которые очень близки и имеют близкую ориентацию. Если одна линия представлена ​​у = х + с, я пытаюсь:

  1. объединить все строки (возможно, 5 линий, которые находятся рядом) в пределах списка с почти одинаковыми значениями т и с и получить одну строку для них.
  2. удалить все консолидированные строки
  3. добавить новую строку, которую я получаю в списке.
+0

это: 'для abs (строка1.c() - строка2.c())

+0

@StephenRauch: Да. жаль, что это было плохо! – navderm

+0

Извините, мне трудно понять, что вы пытаетесь сделать. Не могли бы вы просто объяснить это? У вас есть AllLines с объектами 'Line'. Что вы хотите сделать? – iTayb

ответ

1

Чтобы удалить дубликаты из списка вы в основном нужны сравнить каждый элемент с любым другим элементом из списка. Чтобы не сравнивать дважды, вам нужно запустить второй цикл в позиции первого цикла + 1.

Следующий код делает это, и если он находит дубликат, пропускает первое из двух значений (break) command :

consolidateLines = [] 
for i, line1 in enumerate(allLines): 
    for j, line2 in enumerate(allLines[i+1:]): 
     if abs(line1.m() - line2.m()) < SomeValue and 
      abs(line1.c() - line2.c()) < someOtherValue: 
       break # found a duplicate later in the list, skipping first occurrence 
    else: 
     # no duplicagte found -> add to list 
     consolidateLines.append(line1); 
+0

Ты избил меня на секунду :), но отличная работа. – iTayb

+0

Разве это не единственная линия, близкая к другой? Что делать, если у меня есть 5 строк, которые находятся рядом, и я хочу объединить их все? – navderm

+0

Нет, он проверяет каждую пару. Допустим, у вас есть 4 предмета 1,2,3,4, тогда он будет сравнивать 1-2, 1-3, 1-4, 2-3, 2-4, 3-4 – hansaplast