【问题标题】:Accessing the first elements in a list of Lists [F#]访问列表列表中的第一个元素 [F#]
【发布时间】:2018-03-20 00:08:18
【问题描述】:

我目前对 F# 很感兴趣,因为它与我之前使用的所有东西都不同。我需要访问一个大列表中包含的每个列表的第一个元素。 如果我假设主列表包含“x”个列表,这些列表本身包含 5 个元素,那么访问第一个元素的最简单方法是什么。

让 listOfLists = [ [1;2;3;4;5]; [6;7;8;9;10]; [11;12;13;14;15] ]

我想要的输出是一个包含 [1;6;11] 的新列表

目前我有

let rec firstElements list  =
    match list with
    | list[head::tail] -> 
        match head with
        | [head::tail] -> 1st @ head then firstElements tail

要对此进行扩展,我将如何获得所有第二个元素?最好是在没有第一个元素的情况下创建新列表(通过使用类似函数删除它们)然后重用相同的函数?

【问题讨论】:

    标签: recursion f# sublist


    【解决方案1】:

    可以使用map来提取每个子列表的head元素:

    let firstElements li =
      match li with [] -> None | h::_ -> Some h
    
    let myfirstElements = List.map firstElements listOfLists
    

    我正在使用 Ocaml 的说话,几乎没有在 F# 上查找,所以这可能不准确,但这个想法适用。

    编辑:您也可以使用List.head,这样会更简洁,并返回int list 而不是int option list。但是,如果您点击一个空列表,它会引发异常。大多数时候,在这种情况下,我会避免使用List.headList.tail

    【讨论】:

    • 这将返回int options 的列表,而不是ints 的列表。
    • 无论如何我认为这更好,因为它会强制您处理空列表的情况,而不是从List.head 收到错误。
    • 感谢您的回答。只是一个关于此的快速问题,您将如何将其应用于长度未知的列表?假设我想提取所有第二个元素。我会先写一个函数来删除第一个元素然后重新应用这个函数吗?然后我可以继续这个,直到所有元素都被提取并在单独的列表中?
    • 除了List.head,还有List.tryHead,它与此答案中的firstElements 函数完全相同相同。作为 F# 中的一般规则,任何可能失败的函数(例如,List.head 将在空列表上失败)将具有名称中带有 try 的版本,该版本返回一个选项。所以List.head 返回一个int 但可能会抛出异常; List.tryHead 返回一个 int option 并且永远不会抛出异常。如果您知道您拥有的列表永远不会为空,那么List.head 更易于使用。如果它们可能为空,那么List.tryHead 会让你处理这两种情况。
    • @CodeGuy 在你诉诸递归之前,看看你是否可以通过模式匹配来实现它。对于第二个元素,您可以匹配 _::m::_ 大小写,您将获得 Some mNone
    【解决方案2】:

    访问列表中第一个元素的最简单方法是List.head。因为你有一个列表列表,你只需要List.map这个函数:

    let listOfLists = [ [1;2;3;4;5]; [6;7;8;9;10]; [11;12;13;14;15] ]
    
    listOfLists 
    |> List.map List.head
    //val it : int list = [1; 6; 11]
    

    现在,如果您需要访问其他元素,您可以使用List.item 或使用xs.[1] 索引到您的列表中。但请记住,对于大型列表,这将是低效的,如果您想快速查找,请使用数组。

    listOfLists
    |> List.map (List.item 1)
    //val it : int list = [2; 7; 12]
    

    带索引:

    listOfLists
    |> List.map (fun x -> x.[1])
    

    【讨论】:

      猜你喜欢
      • 2011-09-07
      • 2023-04-07
      • 2017-05-12
      • 1970-01-01
      • 2013-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多