String 如何将字符串拆分为长度为3的字符串列表?
遇到了一个问题,如果我想将诸如“qwertyzxc”(9个元素)(String 如何将字符串拆分为长度为3的字符串列表?,string,haskell,String,Haskell,遇到了一个问题,如果我想将诸如“qwertyzxc”(9个元素)(['q'、'w'、'e'、'r'、't'、'y'、'z'、'x'、'c'])之类的字符列表拆分为长度为3的字符串列表。我该怎么做? 例如: 输入:['q'、'w'、'e'、'r'、't'、'y'、'z'、'x'、'c'] 输出:[['q'、'w'、'e']、['r'、't'、'y']、['z'、'x'、'c'] 谢谢,我已经在这上面呆了很长时间了如果段长度固定为3,那么您可以通过模式匹配执行以下操作 segment :: [a]
['q'、'w'、'e'、'r'、't'、'y'、'z'、'x'、'c'])之类的字符列表拆分为长度为3的字符串列表。我该怎么做?
例如:
输入:['q'、'w'、'e'、'r'、't'、'y'、'z'、'x'、'c']
输出:[['q'、'w'、'e']、['r'、't'、'y']、['z'、'x'、'c']
谢谢,我已经在这上面呆了很长时间了如果段长度固定为3,那么您可以通过模式匹配执行以下操作
segment :: [a] -> [[a]]
segment [] = []
segment [x] = [[x]]
segment [x,y] = [[x,y]]
segment (x:y:z:rest) = [x,y,z] : segment rest
*Main> segment [1,2,3,4,5,6,7,8,9]
[[1,2,3],[4,5,6],[7,8,9]]
或者您也可以尝试此方法,免费检查长度:
segment :: [a] -> [[a]]
segment [a,b,c,d,e,f,g,h,i] = [[a,b,c],[d,e,f],[g,h,i]]
segment _ = error "the list hasn't 9 items"
然后你尝试:
> segment [1,2,3,4,5,6,7,8,9]
[[1,2,3],[4,5,6],[7,8,9]]
及
正如您可能注意到的,您可以使用Data.List.Split中的chunksOf轻松地将其转换为更通用的pN
注释中引用了预先打包的答案,但需要安装
import Data.List.Split(chunksOf)
chunksOf::Int->[e]->[[e]]
--样本使用
3个“HelloWorld”的块==[“Hel”、“loW”、“orl”、“d”]
定义自定义函数,仅前奏曲
我编写的此函数与chunksOf完全相同,但不需要安装任何软件包:
splitInto::Int->String->[String]
拆分为n=foldl(fn)[“”]
哪里
f::Int->[String]->Char->[String]
f n s x
|(n>)$length$last s=init s++[last s++[x]]
|否则=s++[[x]]
它可能会被优化为使用:
而不是++
,但如果性能不受关注,这是可行的。此外,它还可以泛化为字符串以外的任何内容。如果列表不能被三除怎么办?输入的大小总是九。这只是它的使用方式。如果它不是9,我想它会给您一条错误消息,告诉您它的大小不正确。Data.List.Split.chunksOfMy GHCI返回*Main>[“.3.2.6…”、“9..3.5..1”、“.18.64…”、“.81.29…”、“7..8”、“.67.82…”、“.26.95…”、“8..2.3..9”、“.5.1.3..]。你知道为什么它使用“””而不是“[”?因为字符串是字符列表,而Show实例被定义为将字符列表显示为字符串。@Zarolan,字符串是字符列表。ghci通常将列表显示为'h':'o':'l':'a':[]
作为“hola”“
我喜欢这个解决方案,使用回归和归纳也非常简洁!
> segment [1,2,3,4,5,6,7,8]
*** Exception: the list hasn't 9 items
p3::[a] -> [[a]]
p3 [] = []
p3 l = take 3 l : (p3 $ drop 3 l)