2011-12-30 14 views
12

Come posso raggruppare una lista in elenchi più piccoli di uguale lunghezza (tranne l'ultima sottolista) in haskell?Suddividere una lista in haskell

E.g.

sublist 3 [1,2,3,4,5,6,7,8] -> [[1,2,3],[4,5,6],[7,8]] 
sublist 2 [4,1,6,1,7,3,5,3] -> [[4,1],[6,1],[7,3],[5,3]] 

risposta

9

Se si vuole attaccare al preludio, si può tirare fuori questo usando splitAt.

splitEvery _ [] = [] 
splitEvery n list = first : (splitEvery n rest) 
    where 
    (first,rest) = splitAt n list 
+1

o anche 'splitEvery n = TakeWhile (non nullo.). unfoldr (Just. splitAt n) ' – newacct

21

Prova:

import Data.List.Split 
> splitEvery 2 [4,1,6,1,7,3,5,3] 
[[4,1],[6,1],[7,3],[5,3]] 
+7

Per prima cosa è necessario installare il pacchetto [split] (http://hackage.haskell.org/package/split). – ehird

+3

per principianti come me - questo significa eseguire 'cabal install split' –

+4

In realtà,' splitEvery' è ancora raccomandato? ': 1: 1: Attenzione: Nell'uso di‘splitEvery’ Deprecato: " Usa chunksOf"' –

5

Un'altra soluzione che mi piace è:

splitEvery :: Int -> [a] -> [[a]] 
splitEvery n = takeWhile (not.null) . map (take n) . iterate (drop n) 
2

Ancora un'altra soluzione:

split :: Int -> [a] -> [[a]] 
split n = unfoldr (\s -> if null s then Nothing else Just $ splitAt n s) 
0

So che questo è vecchio, ma dal momento che questo sembra essere un post per le persone che sono abbastanza nuovo per Haskell, mi sembrava di pubblicare anche la mia soluzione. Ho cercato di risolvere questo problema utilizzando Preludio, solo:

sublist :: Int -> [a] -> [[a]] 
sublist n ls 
    | n <= 0 || null ls = [] 
    | otherwise = take n ls:sublist n (drop n ls) 

Testing

sublist 3 [1,2,3,4,5,6] -- λ> [[1,2,3], [4,5,6]] 
sublist 5 [1,2,3]  -- λ> [[1,2,3]] 
sublist (-1) [1,2,3] -- λ> [] 
sublist 20 []   -- λ> [] 
6

Il modulo Data.List.Split ha una funzione chunksOf per questo:

Prelude> import Data.List.Split 

Prelude Data.List.Split> chunksOf 3 [1,2,3,4,5,6,7,8,9,10] 
[[1,2,3],[4,5,6],[7,8,9],[10]] 
Prelude Data.List.Split> chunksOf 3 [] 
[] 

sembrava di essere installato da predefinito sulla mia macchina, ma potrebbe essere necessario ottenerlo con la cabala.

Problemi correlati