どのようにしてリストを同じ長さのリスト(最後のサブリストを除く)にグループ化できますか?haskellでリストを細分化する
など。
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]]
どのようにしてリストを同じ長さのリスト(最後のサブリストを除く)にグループ化できますか?haskellでリストを細分化する
など。
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]]
、あなたがsplitAt
を使用して、これをやってのけることができます。
splitEvery _ [] = []
splitEvery n list = first : (splitEvery n rest)
where
(first,rest) = splitAt n list
試してください:あなたは前奏曲に固執する場合
import Data.List.Split
> splitEvery 2 [4,1,6,1,7,3,5,3]
[[4,1],[6,1],[7,3],[5,3]]
[split](http://hackage.haskell.org/package/split)パッケージを先にインストールする必要があります。私のような初心者のための – ehird
- それは 'cabal install split'を実行することを意味します –
実際には、' splitEvery'はまだ推奨されていますか? '
私が好きなもう一つの解決策は以下のとおりです。
splitEvery :: Int -> [a] -> [[a]]
splitEvery n = takeWhile (not.null) . map (take n) . iterate (drop n)
は、さらに別の解決策:
split :: Int -> [a] -> [[a]]
split n = unfoldr (\s -> if null s then Nothing else Just $ splitAt n s)
これがある人々のためのポストのようですので、私はこれが古いですけど、かなり新しい、ハスケル、私は私の解決策を投稿するように感じた。私は、プレリュードを使用することで、この問題を解決しようとした:
sublist :: Int -> [a] -> [[a]]
sublist n ls
| n <= 0 || null ls = []
| otherwise = take n ls:sublist n (drop n ls)
をテスト
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 [] -- λ> []
Data.List.Split
モジュールはこのためchunksOf
機能を持っています
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 []
[]
によってインストールされるように見えました私のマシンのデフォルトですが、カバールで取得する必要があります。
あるいは 'splitEvery N = takeWhile(NOT NULL):「splitEvery」 非推奨の使用において 。 unfoldr(Just。splitAt n) ' – newacct