如何将列表列表变成单个列表 F#
How to make a list of lists into single list F#
我有一个列表列表
LL = [[1;2;3];[4;5;6];[7;8;9]]
我希望它看起来像这样
LSimple= [1;2;3;4;5;6;7;8;9]
我想问的就这么简单,但也许重新措辞会有所帮助。我如何解析这个列表列表并从中创建一个简单列表?
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)
这是最低效的实现,另一个实现将简单地将最后一个案例 return 替换为
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
总的来说,在效率方面不要相信图书馆,要知道制作它们的人和你一样都是人,所以可能会有很多错误。
我有一个列表列表
LL = [[1;2;3];[4;5;6];[7;8;9]]
我希望它看起来像这样
LSimple= [1;2;3;4;5;6;7;8;9]
我想问的就这么简单,但也许重新措辞会有所帮助。我如何解析这个列表列表并从中创建一个简单列表?
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)
这是最低效的实现,另一个实现将简单地将最后一个案例 return 替换为
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
总的来说,在效率方面不要相信图书馆,要知道制作它们的人和你一样都是人,所以可能会有很多错误。