我正在寻找一种实现这个功能的方法:
list = [a b c d e f]
foo(list, 3) = [[a d] [b e] [c f]]
可能的解决方案是:
foo(list,spacing) = zip(goo(list,spacing))
例如,
goo([a b c d e f],3) = [[a b c] [d e f]]
foo
和goo
通常被称为什么,所以我可以寻找现有的解决方案,而不是重新发明轮子?
注意:我没有尝试用文字解释,而是展示了希望更容易获得的例子。任意语法,以便更广泛地理解。
答案 0 :(得分:3)
您可以使用partition:
(partition 3 '[a b c d e f])
=> ((a b c) (d e f))
(partition 2 '[a b c d e f])
=> ((a b) (c d) (e f))
修改强>
(apply map list (partition 3 '[a b c d e f]))
=> ((a d) (b e) (c f))
答案 1 :(得分:1)
我认为没有内置功能。这很容易实现。
我知道你不想要实现,但其中一个标签是Haskell所以也许你想看到这个
p :: Int -> [a] -> [[a]]
p n xs = [ [x | (x ,y) <- ys , y `mod` n == i] | i <- [0 .. n - 1] , let ys = zip xs [0 .. ]]
这很有用。
答案 2 :(得分:1)
您的goo
函数为drop
,带有翻转参数。鉴于此,您可以像在问题中所说的那样实施foo
:
let foo list spacing = zip list (drop spacing list)
这仍然不能完全给出你需要的结果,但是关闭:
Prelude> foo "abcdef" 3
[('a','d'),('b','e'),('c','f')]
编辑:
仔细阅读,goo
函数为splitAt
,并带有翻转参数。鉴于此,foo
可以这样定义:
let foo list spacing = (uncurry zip) $ splitAt spacing list
与以下内容相同:
let foo list spacing = let (left, right) = splitAt spacing list
in zip left right