【问题标题】:Removing data from list inside two for loops从两个for循环内的列表中删除数据
【发布时间】:2017-01-13 06:14:37
【问题描述】:

我有一个数据结构 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. 合并列表中具有几乎相同 m 和 c 值的所有行(可能有 5 行靠近)并为这些行获取一行。
  2. 删除所有合并的行
  3. 添加我在列表中得到的新行。

【问题讨论】:

  • this: for abs(line1.c() - line2.c()) &lt; someOtherValue: 似乎是一个错误。我不清楚这是要做什么。
  • @StephenRauch:是的。对不起,那是我的错!
  • 抱歉,我很难理解您要做什么。你能简单解释一下吗?你有带有Line 对象的AllLines。你想做什么?
  • @iTayb:添加了解释。希望能更清楚

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


【解决方案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);

【讨论】:

  • 这不是只找到一条靠近另一条的线吗?如果我附近有 5 条线路,我想合并所有线路怎么办?
  • 不,它会检查每一对。假设您有 4 个项目 1,2,3,4 那么它将比较 1-2, 1-3, 1-4, 2-3, 2-4, 3-4
  • 您可以在内部 for 循环中添加 print(line1, line2) 以了解发生了什么
  • (100, 100, 200, 200); (100、100、200、201); (100、100、200、199); (100、100、200、100); (100、100、200、101); (100、100、200、99.9); (100、100、200、100.1);所以我尝试将这些行作为 (x1, y1, x2, y2) 值。我预计只有 2 个输出。输出为: (100 , 100 , 200 , 199) (100 , 100 , 200 , 100) (100 , 100 , 200 , 99.9) 最后两个应该合并
  • @navderm SomeValuesomeOtherValue 的值是多少?然后我可以尝试重现
猜你喜欢
  • 1970-01-01
  • 2021-09-26
  • 1970-01-01
  • 1970-01-01
  • 2018-10-28
  • 1970-01-01
  • 2018-02-16
  • 2012-05-31
  • 2021-12-10
相关资源
最近更新 更多