list - Haskell 将不同索引处的 2 个列表的元素组合在一起
问题描述
为这个糟糕的标题道歉,我不太确定如何用语言来描述它,但这就是我的意思。如果您知道更好的表达方式,请告诉我。
假设我有 2 个长度相同的列表。
[a, b, c] [x, y, z]
我想创建列表
[[a, y, z], [b, x, z], [c, x, y]]
基本上对于list1 的每个元素,我希望list2 中第一个元素的不同索引处的2 个元素。
因此,对于索引 0 处的“a”,其他 2 个是索引 1 处的“y”和索引 2 处的“z”。
我很确定我知道如何使用索引来做到这一点,但是,我知道这不是很有效,我想看看是否有更实用的解决方案。
谢谢你。
解决方案
我会用拉链来做。这是我在许多项目中编写的函数,我已经记住了它:
zippers :: [a] -> [([a], a, [a])]
zippers = go [] where
go b [] = []
go b (h:e) = (b, h, e) : go (h:b) e
(这实际上返回的信息比我们在此应用程序技术上所需的信息要多。但它是通用形式——在许多情况下很有用,其中仅返回前缀/后缀对并省略当前焦点的受限版本有时还不够.)
有了这个工具,我们可以zip
(不同类型的 zip!)将一个列表中的值与另一个列表的 zippers 放在一起。
combine :: [a] -> [a] -> [[a]]
combine xs ys = zipWith (\x (b, h, e) -> reverse b ++ [x] ++ e) xs (zippers ys)
在 ghci 中尝试一下:
> combine "abc" "xyz"
["ayz","xbz","xyc"]
推荐阅读
- java - 反序列化不带引号的 JSON 字符串列表的非标准(错误)格式的最干净方法
- java - 从效率的角度创建一个新的 JSP 页面或使用现有的页面
- sql - 查找结束日期和开始日期在同一个月的订阅者数量
- html - 单击时将按钮值添加到输入字段
- sql - JOINS 和多表查询
- groovy - 如何在 groovy 中导入和使用函数
- .net - OracleDependency 不会触发事件
- regex - 正则表达式:如何仅找到字符 <> 内的每个 ' 字符?
- javascript - 如何在 XY 图表类型中设置 x 和 y 轴的范围值最小值/最大值
- apache-kafka - Kafka 控制台检查我的 java api 是否正确使用消息