根据条件删除 python 集中的条目

Remove entries in a python set based on condition

我使用 scipy.spatial.KDTree.query_pairs() 返回了 python 组元组。 比方说,这是输出:

set1 = {(2, 3), (4, 5), (1, 6), (6, 7), (3, 8), (6, 8)}

接下来,我要擦除集合中所有不满足条件的元组

arr = [6, 7]
tuple[0] in arr or tuple[1] in arr

什么是最elegant/fast/pythonic的方式?我是否应该转换为 numpy 数组?

您需要遍历并检查 set1 中的每个元组,您可以使用 set comprehension, and any():

>>> set1 = {(2, 3), (4, 5), (1, 6), (6, 7), (3, 8), (6, 8)}
>>> arr = [6, 7]
>>> set2 = set(arr)  # convert to set for O(1) lookup time
>>> set3 = {t for t in set1 if any(x in set2 for x in t)}
>>> set3
{(6, 7), (6, 8), (1, 6)}

解决此问题的一种方法是遍历集合并为满足条件的元素创建数组,然后将数组转换为集合。

这可以通过单行解决方案来完成,例如:

set2 = set([a for a in set1 if a[0] not in key and a[1] not in key])

希望这就是您要找的

filtered = [x,y for x,y in set1 if (x,y) == (6,7)]

或尝试将 lambda 用于复杂过滤器。

在不将您的数据转换为 numpy 数组的情况下,这就是我解决此问题的方法:

set1 = {(2, 3), (4, 5), (1, 6), (6, 7), (3, 8), (6, 8)}
arr = [6, 7]

filtered = list(filter(lambda xy: bool(set(xy) & set(arr)), set1))

如果 set1 中的元素长度显着增长并且您决定使用 numpy,那么我将只更改集合交集对于 numpyintersect1d

如果 set1 的长度反而增加了,那么我建议您看看另一个 以了解如何过滤 numpy 数组。