我有一个重复的元组列表,并没有特别的顺序。这是一个例子
let list = [(0,0), (0,1), (1,0), (1,1), (1,2)]
我想过滤此列表,并从列表中获取4个元组的每个唯一组合
我找到example code来获取一个唯一的列表,其中顺序无关紧要,我不知道如何调整它以获得一组唯一的4。
使用上面的列表输出将有2个唯一的4组。
[(0, 0), (0, 1), (1, 0), (1, 1)]
[(0, 1), (1, 0), (1, 1), (1, 2)]
[(0, 0), (0, 1), (1, 0), (1, 2)]
[(0, 0), (0, 1), (1, 1), (1, 2)]
[(0, 0), (1, 0), (1, 1), (1, 2)]
答案 0 :(得分:2)
列表monad中的类似内容可让您轻松选择所有组合。 Set.fromList
在(==)
上定义了Set.Set
,忽略了顺序。
import Data.List ((\\), nub)
import qualified Data.Set as Set
someFours xs = nub $ do
let xs' = nub xs
choice1 <- xs'
choice2 <- xs' \\ [choice1]
choice3 <- xs' \\ [choice1, choice2]
choice4 <- xs' \\ [choice1, choice2, choice3]
return $ Set.fromList [choice1, choice2, choice3, choice4]
答案 1 :(得分:2)
一种解决方案是使用
let sane = nub list in filter (\x -> length x == 4) $ filterM (const [True, False]) sane
需要sane = nub list
才能删除原始列表中的重复项。 filterM ...
部分获取sane
的powerset中的所有集合,此处我们只选择长度为4
的那些。
由于我们首先生成powerset的所有元素,因此上述效率不高。如果需要性能,请使用J. Abrahamson's answer。
答案 2 :(得分:1)
这可能是一个有效且紧凑的解决方案(假设我已正确理解您的问题):
import Data.List (nub)
kSubsets :: (Eq a) => Int -> [a] -> [[a]]
kSubsets k = go k . nub
where
go 0 _ = [[]]
go n [] = []
go n (x:xs) = map (x:) (go (n-1) xs) ++ go n xs