从两个for循环中的列表中删除数据

时间:2017-01-13 06:14:38

标签: python python-3.x computer-vision computational-geometry

我有一个数据结构Line,其大纲是:

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

在主循环中,我有一个已经填充的行列表。

我想要做的是合并m和c值非常接近的线,这样我得到单行而不是检测到的多行

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.

解释问题: 我有一个行列表。由于使用计算机视觉算法(霍夫变换)检测这些线,因此一些线彼此非常接近。那不太理想。因此,我试图巩固所有非常接近且具有接近方向的线。如果一行由y = mx + c表示,我试图:

  
      
  1. 合并列表中的所有行(可能有5条靠近的行),其中m和c的值几乎相同,并为这些行获取一行。
  2.   
  3. 删除所有合并的行
  4.   
  5. 添加我在列表中获得的新行。
  6.   

1 个答案:

答案 0 :(得分:1)

要从列表中删除重复项,您基本上需要将每个元素与列表中的每个其他元素进行比较。为了不进行两次比较,您需要在第一个循环+ 1的位置开始第二个循环。

以下代码执行此操作,如果找到重复项,则会跳过这两个值中的第一个(break)命令:

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);