如何通过不使用“列表推导”来获取列表中元素的索引?

计划猫

我是Haskell编程的新手,我尝试通过/不使用列表推导来解决问题。

问题是在列表中查找元素的索引并返回索引列表(在列表中找到元素的位置)。

我已经通过使用列表推导解决了问题,但是现在我有一些不使用列表推导来解决问题的问题。

以我的递归方式:

我尝试将[0..(length list)]和的列表压缩为自己。然后,如果元素a等于列表中的元素->用压缩的Tupel的第一个元素创建一个新列表,然后list(my index)以递归方式搜索该函数,直到列表为[]。

这就是我的列表理解(有效):

positions :: Eq a => a -> [a] -> [Int]
positions a list = [x | (x,y) <- zip [0..(length list)] list, a == y]

那是我的递归方式(不起作用):

positions' :: Eq a => a -> [a] -> [Int]
positions' _ [] = []
positions' a (x:xs) =
    let ((n,m):ns) = zip [0..(length (x:xs))] (x:xs)
    in if (a == m) then n:(positions' a xs)
       else (positions' a xs) 

*对不起,我不知道如何突出显示单词

但是ghci说:

*Main> positions' 2 [1,2,3,4,5,6,7,8,8,9,2]
[0,0]

它应该是这样(我的列表理解):

*Main> positions 2 [1,2,3,4,5,6,7,8,8,9,2]
[1,10]

我的错误在哪里?

罗宾·齐格蒙德

您尝试的问题只是当您说:

let ((n,m):ns) = zip [0..(length (x:xs))] (x:xs)

然后n永远是0这是因为您要(n,m)与的第一个元素进行匹配,该元素zip [0..(length (x:xs))] (x:xs)必须始终为(0,x)

这本身不是问题,但是这确实意味着您必须正确处理递归步骤。你有它的方式,现在,positions _ _如果非空,将始终0它的第一要素,因为你允许它找到一个匹配的唯一方法是,如果它在列表的头部,导致的一个指标0这意味着您的结果将始终是正确长度的列表,但包含所有元素0-如您所见。

问题不在于您的递归方案,而是与您不修改结果以说明您不总是希望0将其添加到结果列表的开头有关。由于每个递归调用仅向要查找的索引加1,因此您要做的就是递归结果上map的增量函数(+1)

positions' :: Eq a => a -> [a] -> [Int]
positions' _ [] = []
positions' a (x:xs) =
    let ((0,m):ns) = zip [0..(length (x:xs))] (x:xs)
    in if (a == m) then 0:(map (+1) (positions' a xs))
       else (map (+1) (positions' a xs))

(请注意,我已将您更改letn始终是显式的0-我宁愿以这种方式进行显式更改,但这本身不会更改输出。)由于m始终绑定xns根本没有使用,我们可以取消let,插入以下内容的定义m

positions' :: Eq a => a -> [a] -> [Int]
positions' _ [] = []
positions' a (x:xs) =
    if a == x
    then 0 : map (+1) (positions' a xs)
    else     map (+1) (positions' a xs)

如果愿意,可以继续排除重复的因素map (+1) (positions' a xs)

顺便说一句,您不需要显式递归来避免此处的列表理解。其一,列表内涵基本上都是针对的用途的替代mapfilter我本来要明确地写出来,但是我看到@WillemVanOnsem给出了这个答案,所以我将简单地介绍给他。

另一种方式,尽管如果要求您自己实现这一点也许不可接受,但是将仅使用内置的elemIndices函数,该函数正是您要在此处实现的功能。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用列表推导来存储列表的嵌套列表

如何通过索引从列表中删除元素

如何通过地址获取元组中元素的索引?

使用流遍历列表时如何获取元素索引?

通过嵌套列表中元素的索引找到嵌套列表的最小值和最大值

查找列表中元素索引的最快方法

获取对列表中元素的引用

python快速获取较大列表中元素的索引,该列表也存在于较小列表中

如何获取列表列表中外部列表元素的索引?

如何获取列表元组元素的列表索引

飞镖:获取列表2中元素的索引(列表1中的元素)

Haskell-如何获取列表中元素的索引?

当用数组填充列表时,如何在SwiftUI中获取列表中元素的索引?

返回列表C ++中元素的索引

如何从该矩阵生成的列表中获取矩阵中元素的索引?

如何使用python中的列表推导计算列表中元素的出现次数?

获取列表中元素的索引(python)

如何使用python的列表推导来执行以下matlab代码?

python - 通过与另一个列表的元素进行比较来查找列表中元素索引的最快方法

查找列表中元素的索引

如何找到列表中元素的所有索引?

如何打印列表中元素的索引 - python

嵌套列表中元素的索引

Python如何通过知道列表中列表的第一个元素来获取列表中列表的索引?

如何使用 mongoDB 中的索引列表获取数组元素?

如何获取二维列表中元组的索引?

使用通配符查找列表中元素的索引

如何通过索引获取列表类型的元素

使用 groupby 获取包含列中元素的列表字典