有一种简单的方法可以检查两个列表是否包含公共元素。
即
set1 = [1,2,3,4]
set2 = [[1,5,7],[1,2,3,8]]
有没有办法可以隔离set1中的元素但不能隔离set2中的任何集合? 最好的方法是将set2中的x数量的集合添加到一起以使用一个大集合(使用concat)来与set1进行比较,或者这是浪费时间吗?
非常感谢任何建议。
答案 0 :(得分:1)
import Data.Set as Set
foldl (\x y -> Set.difference x (Set.fromList y)) (Set.fromList set1) set2
提供以下输出:
fromList [4]
并且总是会给set1的成员,这些成员不在set2中的任何集合中 - 这似乎是你的问题。
答案 1 :(得分:0)
尝试
filter (`notElem` (concat set2)) set1
它将返回set1
中所有元素的列表,这些元素不在set2
的任何列表中。但是,我不知道它的空间复杂性。
答案 2 :(得分:0)
您可以在set2
中创建一组所有元素并使用它来过滤set1
:
import Data.Set as Set
let s = foldl (flip Set.insert) Set.empty (join set2) in [e | e <- set1, e `notMember` s]