对这个糟糕的标题表示歉意,我不太确定如何用语言描述它,但这就是我的意思。如果您知道更好的表达方式,请告诉我。
假设我有 2 个长度相等的列表。
[a, b, c] [x, y, z]
我想创建列表
[[a, y, z], [b, x, z], [c, x, y]]
本质上,对于 list1 的每个元素,我希望这两个元素与 list2 中的第一个元素具有不同的索引。
因此,对于索引 0 处的“a”,其他 2 个是索引 1 处的“y”和索引 2 处的“z”。
我很确定我知道如何使用索引来做到这一点,但是,我知道这不是很有效,并且想看看是否有更实用的解决方案。
谢谢。
您尚未描述任何边缘情况,但您可以通过以下方式获得您正在寻找的基本行为:
import Data.List (inits, tails)
combine :: [a] -> [a] -> [[a]]
combine xs ys = zipWith3 go xs (tails ys) (inits ys)
where
go a (_:xs) ys = a:ys ++ xs
go _ _ _ = []
关键是tails
返回从完整列表开始的列表的连续后缀,并且inits
返回以空列表开头的连续前缀。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)