我有一份清单
LL = [[1;2;3];[4;5;6];[7;8;9]]
我希望它看起来像这样
LSimple= [1;2;3;4;5;6;7;8;9]
这很简单,我可以问它,但也许重写帮助。如何解析这个列表列表并从中创建一个简单的列表?
答案 0 :(得分:8)
List.concat LL
会做你想做的事。 X.concat函数系列将集合X的任何序列连接到单个X,其中X可以是List
,Array
,Seq
甚至是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
通常,在效率方面,不要信任库,要知道创建库的人就像你一样是人类,因此可能会有很多错误。