【问题标题】:How to remove a list from list of lists based on a condition?如何根据条件从列表列表中删除列表?
【发布时间】:2019-02-01 22:14:22
【问题描述】:

我正在尝试根据条件从列表列表中删除列表。例如,pnts 是使用 P1、P2、P3、P4 和 P5 等列表形成的列表列表。这些 P1、P2、P3、P4 和 P5 代表空间中的一个点位置。我想删除彼此非常接近的点,例如 P4 和 P5。由于 P4 和 P5 非常接近 P1 并且仅在新列表中保留它们的第一次出现。使用下面给出的完整代码函数“is_equal”检查每个点的接近度。

P1 = [3.333, 0.000, 0.000]
P2 = [0.000, 0.000, 0.000]
P3 = [10.000, 0.000, 0.000]
P4 = [3.333, 0.000, 0.000]
P5 = [3.3, 0.000, 0.000]

pnts = [P1, P2, P3, P4, P5]

如果两点之间测量的距离接近于零,则应从列表中删除第二个重复点。

所以答案应该是,

pnts = [P1, P2, P3]

完整代码如下,

import math
import collections
import itertools

def is_equal(grid1, grid2):
    L = math.sqrt((grid1[0]-grid2[0])**2 + (grid1[1]-grid2[1])**2 + (grid1[2]-grid2[2])**2)
    if round(L)==0:
        return True
    else:
        return False

P1 = [3.333, 0.000, 0.000]
P2 = [0.000, 0.000, 0.000]
P3 = [10.000, 0.000, 0.000]
P4 = [3.333, 0.000, 0.000]
P5 = [3.3, 0.000, 0.000]

pnts = [P1, P2, P3, P4, P5]

我尝试过使用itertools groupby 函数但我无法得到正确答案,即

list(pnts for pnts,_ in itertools.groupby(pnts))

谁能提出一个更好的方法来处理这种重复的点删除?

【问题讨论】:

  • 我认为您最好使用 numpy,并从 ndarray 构建欧几里德距离矩阵
  • 感谢您的建议。那么让我尝试用 numpy 来做吧。
  • 您能详细说明一下最终目标吗?根据您最终要实现的目标,可以使用层次聚类或 DBSCAN,以防您希望得到特定数量的点或具有被认为不同点的最小距离。

标签: python python-3.x list collections itertools


【解决方案1】:

这里有一段代码可以满足您的要求,但您可能需要根据需要调整精度点

P1 = [3.333, 0.000, 0.000]
P2 = [0.000, 0.000, 0.000]
P3 = [10.000, 0.000, 0.000]
P4 = [3.333, 0.000, 0.000]
P5 = [3.3, 0.000, 0.000]

pnts = [P1, P2, P3, P4, P5]

pnts_filteres = set([tuple([round(v, 1) for v in p]) for p in pnts])
print(pnts_filteres)

{(3.3, 0.0, 0.0), (0.0, 0.0, 0.0), (10.0, 0.0, 0.0)}

【讨论】:

    猜你喜欢
    • 2022-12-23
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 2017-08-31
    • 2017-01-15
    • 2021-12-14
    相关资源
    最近更新 更多