F#过滤列表

时间:2018-04-05 21:33:07

标签: f#

我如何按索引筛选出列表? 清单:[400; 5; 401; 6; 403; 7] 过滤清单:[5; 6; 7;]

我想过滤掉奇数索引号。所以我可以比较这些值然后打印出最大值。

3 个答案:

答案 0 :(得分:4)

一种简单直接的方法是递归列表并选择每一个元素:

let getOddIndexed list =
    let rec aux acc xs =
        match xs with
        | _::x::tail -> aux (x::acc) tail
        | _ -> acc |> List.rev
    aux [] list

答案 1 :(得分:2)

在特定情况下,你问过(保留奇数索引号并删除偶数索引号),John Reynolds'答案会奏效。但是在基于索引的过滤器更复杂的一般情况下,您需要使用Seq.indexed,这会将任何项目列表转换为(索引,项目)对列表。 E.g:

["apple"; "banana"; "cherry"] |> Seq.indexed |> List.ofSeq
// Produces [(0, "apple"); (1, "banana"); (2, "cherry")]

使用这种方法,您可以使用Seq.filter进行所需的过滤,然后将序列重新转换为最后的列表:

let keepOdd (idx, item) =
    // A more complicated filter might use the item parameter too
    idx % 2 <> 0

let input = [400; 5; 401; 6; 403; 7]
input |> Seq.indexed |> Seq.filter keepOdd |> List.ofSeq

答案 2 :(得分:1)

这是使用foldBack的另一种解决方案

let folder x (index,lst) =
    if   index % 2 = 0
    then (index+1, x::lst)
    else (index+1, lst)

let list = snd (List.foldBack folder [400; 5; 401; 6; 403; 7] (0,[]))