Haskell中如何筛选出第二个元素存在于另一列表中的元组?
在Haskell中筛选第二个元素属于指定列表的元组
当然可以实现这个需求,核心思路是用filter函数结合元素存在性判断,下面给出两种实现方式:
基础实现(适合小数据量)
直接利用elem函数判断元组的第二个元素是否在指定键列表中:
-- 类型约束:元组的第二个元素类型需要支持相等判断 filterTuples :: Eq a => [a] -> [(b, a)] -> [(b, a)] filterTuples keys = filter (\(_, val) -> val `elem` keys)
示例测试
给定:
- 键列表:
[1, 2, 3] - 元组列表:
[('foo', 2), ('bar', 3), ('oof', 2), ('rab', 5)]
调用函数:
filterTuples [1,2,3] [('foo',2),('bar',3),('oof',2),('rab',5)]
得到结果:[('foo',2),('bar',3),('oof',2)]
优化实现(适合大数据量)
如果键列表元素较多,elem的线性查找效率较低,可以借助Data.Set将键列表转换为集合,利用集合的O(log n)成员判断提升性能:
import qualified Data.Set as Set -- 类型约束:元组的第二个元素类型需要支持排序(Set的要求) filterTuplesFast :: Ord a => [a] -> [(b, a)] -> [(b, a)] filterTuplesFast keys = let keySet = Set.fromList keys in filter (\(_, val) -> Set.member val keySet)
内容的提问来源于stack exchange,提问作者joater limon
相关产品推荐
相关产品推荐

