【问题标题】:How to filter indexes in a list?如何过滤列表中的索引?
【发布时间】:2019-11-20 19:51:25
【问题描述】:

例如,如果我有一个列表

[2,2,3,5,4,6]

我过滤偶数,我想输出这些数字的索引:

[1,2,5,6]

我知道返回元素的filter 函数。我怎样才能得到他们的索引呢? 我已经定义了函数索引,它将带有索引的元素返回为连音。任何提示我应该如何继续?

index x = [ n | n <- [ zip x [1..]]]

【问题讨论】:

  • 抱歉,没找到!
  • 我也许可以通过那里的 cmets 中的提示自己解决这个问题
  • cmets 对这个问题的“提示”并不多,但使用findIndicies:findIndices even [2,2,3,5,4,6] 完全符合您的要求。
  • 我想创建索引列表,但现在我不知道如何继续

标签: haskell functional-programming


【解决方案1】:

在您的代码中,

index x = [ n | n <- [ zip x [1..] ] ]

[ n | n &lt;- [ e ]] 等价于[ n | let n=e ] 等价于let n = e in [n] 或只是[e],即[zip x [1..]]。这不是你想要的。

index x = [ n | n <- ( zip x [1..] ) ]

另一方面,是不同的。括号用于分组,因此是多余的,可以在此处省略。然后代码相当于[ n | n &lt;- e ],相当于e,即zip x [1..],更接近了一步。

你只需要解构n,它是一对元素和一个索引(由zip构造),如果元素是偶数,则在输出列表中包含一个索引。

我们通过模式匹配来解构值。

一对模式写成(a,b),或(e,i)等

【讨论】:

    【解决方案2】:

    首先,您可以使用zip 给出列表的索引。从带有索引的列表中,我们可以filter 具有偶数值的列表。之后我们就可以提取值了。

    -- Will be (Value, Index) tuple
    withIndex :: [Int] -> [(Int, Int)]
    withIndex x = zip x [1..]
    
    main =
        print (
            map snd (
                filter
                    (even . fst)
                    (withIndex [2, 2, 3, 5, 4, 6])
            )
        )
    

    https://ideone.com/GDmW6j

    【讨论】:

      猜你喜欢
      • 2018-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-04
      • 2013-09-19
      • 1970-01-01
      相关资源
      最近更新 更多