【发布时间】:2021-03-31 00:39:37
【问题描述】:
有没有办法像这样在单个列表中配对元素:
将[cat,dog,bird,rabbit] 更改为[(cat,dog),(bird,rabbit)]
我知道zip 函数,但它结合了两个列表,我该如何为一个列表执行此操作?
【问题讨论】:
-
如果你传递的列表有奇数个元素,你的函数应该怎么做?
有没有办法像这样在单个列表中配对元素:
将[cat,dog,bird,rabbit] 更改为[(cat,dog),(bird,rabbit)]
我知道zip 函数,但它结合了两个列表,我该如何为一个列表执行此操作?
【问题讨论】:
使用zip 的一种可能方法是将列表中的偶数位置元素与奇数位置元素列表压缩:
takeEveryN :: Int -> [a] -> [a]
takeEveryN _ [] = []
takeEveryN n (x:xs) = x : takeEveryN n (drop (n - 1) xs)
zipList :: [a] -> [(a, a)]
zipList xs = zip (takeEveryN 2 xs) (takeEveryN 2 (drop 1 xs))
【讨论】:
tail,而是使用drop 1。 :) tail 会在空列表上出错,drop 1 不会。
zipWith f 一起使用,而不是zip。