【问题标题】:How to make a list of lists into single list F#如何将列表列表变成单个列表 F#
【发布时间】:2015-02-25 06:57:25
【问题描述】:

我有一个列表列表

LL = [[1;2;3];[4;5;6];[7;8;9]]

我希望它看起来像这样

LSimple= [1;2;3;4;5;6;7;8;9]

这很简单,但也许改写会有所帮助。如何解析这些列表并从中创建一个简单的列表?

【问题讨论】:

    标签: f#


    【解决方案1】:
    List.concat LL 
    

    会做你想做的。 X.concat 系列函数将集合 X 的任何序列连接到单个 X,其中 X 可以是 ListArraySeq,甚至是带有给定分隔符的 String

    【讨论】:

      【解决方案2】:

      根据 List.concat 的实现,它可能非常低效。如果它是用幼稚的方法实现的,它将使用幼稚的方式进行单个附加。 对于简单的情况:假设我们有两个列表 xs ys 我们希望附加在一起。

      那么实现就是

      let rec append =
          function
          | [], ys -> ys
          | xs, [] -> xs
          | x::xs, y::ys -> append(x :: append (xs,[y]), ys)
      

      这是最低效的实现,另一个实现将简单地将最后一个 case return 替换为

      x::append(xs,y::ys)
      

      两者都有 O(n) 的运行时间。但最后一个将有一个较小的 konstant k (k*n)。

      下面给出了运行时间为 2*k*n 的最有效方式。其中 n 是元素的数量,k 是将单个元素连接到列表的 kost。

      let collapse lst =
         let rec help acc =
            function
            | [] -> // conversion point
               List.rev acc
            | (x :: []) :: xss -> // singleton case
               help (x :: acc) xss
            | (x :: xs) :: xss -> // general case
               help (x :: acc) (xs :: xss)
         help [] lst // return 
      

      一般来说,就效率而言,不要相信库,并且要知道制作它们的人只是像你一样的人,所以可能会有很多错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-27
        • 2021-12-31
        • 2018-02-27
        • 2021-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-04
        相关资源
        最近更新 更多