如何将列表列表放入单个列表F#

时间:2015-02-25 06:57:26

标签: f#

我有一份清单

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

我希望它看起来像这样

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

这很简单,我可以问它,但也许重写帮助。如何解析这个列表列表并从中创建一个简单的列表?

2 个答案:

答案 0 :(得分:8)

List.concat LL 

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

答案 1 :(得分:1)

取决于List.concat的实现,它可能效率很低。如果以朴素的方法实现,它将使用朴素的方式进行单个附加。 对于简单的情况:假设我们有两个列表xs y,希望将它们附加在一起。

然后实施将是

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

这是目前效率最低的实现,另一种实现将简单地将最后一个案例返回替换为

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

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

运行时间为2 * k * n的最有效方法如下。其中n是元素数,k是将单个元素连接到列表的原则。

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 

通常,在效率方面,不要信任库,要知道创建库的人就像你一样是人类,因此可能会有很多错误。