haskell中元组列表中4的独特组合

时间:2013-11-17 23:50:19

标签: haskell

我有一个重复的元组列表,并没有特别的顺序。这是一个例子

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)]

3 个答案:

答案 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