过滤包含列表元素的列表列表的元素

时间:2012-11-07 14:12:56

标签: haskell

所以,要解释一下那个问题......

我正在尝试使用过滤器,而不是在任何地方。所以这就是我想要的行为。给出一个列表(Integer s)即

[[1,2,3],[23456,4,3,2],[1,3,4,5,6],[3,2,1],[4,2,1],[5,6,7],[1,2,5]]

我想采取另一个列表,即[1,2],并采取包含两者这些元素的所有列表。 (如果在此时刻保留其他任何其他内容并不重要,尽管以后可能需要这样做)。所以在这个例子中我的输出类似于

[[1,2],[2,1],[2,1],[1,2]]

或者最好

[[1,2,3],[3,2,1],[4,2,1],[1,2,5]]

4 个答案:

答案 0 :(得分:5)

首先,定义一个列表的元素作为另一个列表的子集意味着什么:

> let xs `isSubsetOf` ys = all (`elem` ys) xs

然后你可以部分应用这个函数来得到一个合适的谓词来过滤:

> let xss = [[1,2,3],[23456,4,3,2],[1,3,4,5,6],[3,2,1],[4,2,1],[5,6,7],[1,2,5]]
> filter ([1, 2] `isSubsetOf`) xss
[[1,2,3],[3,2,1],[4,2,1],[1,2,5]]

这对小投入有用。对于较大的输入,您可能希望使用Data.Set而不是列表。

答案 1 :(得分:3)

ghci> import Data.Set hiding (filter)
ghci> let subset xs ys = fromList xs `isSubsetOf` fromList ys
ghci> let xs = [[1,2,3],[23456,4,3,2],[1,3,4,5,6],[3,2,1],[4,2,1],[5,6,7],[1,2,5]]
ghci> filter (subset [1,2]) xs
[[1,2,3],[3,2,1],[4,2,1],[1,2,5]]

答案 2 :(得分:2)

如果列表candidate的所有元素也是criterion的元素,那么您希望保留列表candidate。因此,您的filter条件

condition candidate = all (`elem` candidate) criterion

,使用flip我们可以写为

condition candidate = flip all criterion (flip elem candidate)

因此给予

filter (flip all criterion . flip elem)

答案 3 :(得分:0)

similars :: Eq a => [a] -> [[a]] -> [[a]]
similars xs  =  filter (\ ys -> all (`elem` ys) xs)

含义

similars [1,2] [[1,2,3],[23456,4,3,2],[1,3,4,5,6],[3,2,1],[4,2,1],[5,6,7],[1,2,5]]

==Š

[[1,2,3],[3,2,1],[4,2,1],[1,2,5]]