通过查看另一个列表来删除列表元素

时间:2012-12-31 05:01:43

标签: haskell

我有两个清单。一个列表包含一些随机数据,其他列表包含需要删除的第一个列表的索引。

例如,让我们考虑两个列表:

let a = [3,4,5,6,6,7,8]
let b = [1,3]

然后,结果输出应为[3,5,6,7,8]。数字4和6被删除,因为它们分别位于索引位置1和3上。

我是Haskell的新手,因此很难找到解决方案。

更新:以下代码使其正常工作

import Data.List
dele :: Eq a => [a] -> [Int] -> [a]
dele [] _ = []
dele x [] = x
dele x (y:ys) = dele (delete (x !! y) x) ys

我只是想知道,有没有办法通过地图/折叠方式来解决它?

3 个答案:

答案 0 :(得分:2)

deleteByIndex :: (Enum a, Eq a, Num a) => [a] -> [b] -> [b]
deleteByIndex r = map snd . filter (\(i, _) -> notElem i r) . zip [0..]

[0..]生成无限列表[0, 1, 2, 3, ...]

zip[(0,x), (1, y), ...]

的形式构建一个包含此列表值和输入列表的对的列表

filter采用函数a -> Bool。 lambda检查索引(对的第一个元素)是否在输入列表r中。

map snd返回每对邮政列表的第二个元素。

记录了{p> zipfiltermapnotElem here

答案 1 :(得分:2)

脱离我的头顶:

removeByIndex :: [Integer] -> [a] -> [a]
removeByIndex indices = map snd . filter notInIndices . zip [0..]
    where notInIndices (i,_) = i `notElem` indices

答案 2 :(得分:1)

最近使用镜头库的另一个答案

import Control.Lens
>let a = [3,4,5,6,6,7,8]
>let b = [1,3]
>a^..elements (`notElem`b)
[3,5,6,7,8]

(^ ..)是toListOf的中缀,它可用于遍历结构并从其各部分中列出一个列表。元素功能只允许您选择要包含的元素。

其他选项是“遍历”遍历一个遍历,“两者”遍历一个(,),它们与(。)组合在一起,所以遍历。两个遍历[(1,2),(3,4)]例如。

  

[(1,2),(3,4)] ^ .. traverse.both   [1,2,3,4]