我如何按索引筛选出列表? 清单:[400; 5; 401; 6; 403; 7] 过滤清单:[5; 6; 7;]
我想过滤掉奇数索引号。所以我可以比较这些值然后打印出最大值。
答案 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,[]))