【发布时间】: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#
我有一个列表列表
LL = [[1;2;3];[4;5;6];[7;8;9]]
我希望它看起来像这样
LSimple= [1;2;3;4;5;6;7;8;9]
这很简单,但也许改写会有所帮助。如何解析这些列表并从中创建一个简单的列表?
【问题讨论】:
标签: f#
List.concat LL
会做你想做的。 X.concat 系列函数将集合 X 的任何序列连接到单个 X,其中 X 可以是 List、Array、Seq,甚至是带有给定分隔符的 String。
【讨论】:
根据 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
一般来说,就效率而言,不要相信库,并且要知道制作它们的人只是像你一样的人,所以可能会有很多错误。
【讨论】: