根据条件删除python集中的条目
Posted
技术标签:
【中文标题】根据条件删除python集中的条目【英文标题】:Remove entries in a python set based on condition 【发布时间】:2022-01-19 11:21:15 【问题描述】:我使用了 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
最优雅/快速/pythonic 的方式是什么?我应该转换为 numpy 数组吗?
【问题讨论】:
这能回答你的问题吗? What is the most Pythonic way to filter a set? 【参考方案1】:您需要遍历并检查set1
中的每个元组,您可以使用set comprehension 和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)
【讨论】:
【参考方案2】:解决此问题的一种方法是遍历集合并为满足条件的元素创建一个数组,然后将该数组转换为一个集合。
这可以通过单行解决方案来完成,例如:
set2 = set([a for a in set1 if a[0] not in key and a[1] not in key])
【讨论】:
【参考方案3】:希望这就是你要找的东西
filtered = [x,y for x,y in set1 if (x,y) == (6,7)]
或尝试将 lambda 用于复杂的过滤器。
【讨论】:
【参考方案4】:如果不将您的数据转换为 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,那么我只需更改 numpy 的集合交集>的intersect1d
如果 set1 的长度反而增加了,那么我建议你看看另一个 *** post 看看如何过滤一个 numpy 数组。
【讨论】:
以上是关于根据条件删除python集中的条目的主要内容,如果未能解决你的问题,请参考以下文章
我的 for 循环没有根据条件删除数组中的项目? Python [重复]
如何根据python中的多个条件对excel文件进行重复数据删除?