我有一个foo: seq<int*int>
我想拆分元组项,然后将结果存储到两个变量中,每个变量都是一个seq<int>。
我想知道是否有更漂亮的方法可以做到这一点。
let item1, item2 = foo |> ?????我目前的解决方案:
let item1 = foo |> Seq.map(fun (f1,_) -> f1)
let item2 = foo |> Seq.map(fun (_,f2) -> f2)发布于 2016-05-04 18:31:34
遗憾的是,语言中没有附带的Seq.unzip函数,尽管列表(List.unzip)和数组(Array.unzip)的等价物确实存在。
有几种方法可以定义这样的函数,其中一种方法是:
let unzip sequence =
let (lstA, lstB) =
Seq.foldBack (fun (a,b) (accA, accB) ->
a::accA, b::accB) sequence ([],[])
(Seq.ofList lstA, Seq.ofList lstB)或者,如果您不关心在列表之间来回切换,您可以这样做:
let item1, item2 =
let it1, it2 =
foo
|> List.ofSeq
|> List.unzip
(Seq.ofList it1, Seq.ofList it2)发布于 2016-05-04 18:24:46
你想得到的是两个不同的序列,所以你不会找到一个更漂亮的方法来做到这一点。您所拥有的几乎是足够的,但是您可以通过使用fst和snd分别取笑元组的第一项和第二项,并将这两个表达式写在同一行上,使其更短一些:
let items1, items2 = foo |> Seq.map fst, foo |> Seq.map snd发布于 2016-07-26 21:26:35
要添加TheInnerLight的答案,正式文件告诉我们:
Seq.zip和Seq.zip3使用两个或三个序列并产生一个元组序列。这些函数类似于列表中可用的相应函数。没有相应的功能将一个序列分离成两个或多个序列。如果序列需要此功能,请将序列转换为列表并使用List.unzip。
我的自发解决方案(类似于OP的方法)应该是编写:
let unzip sequence =
let source = Seq.cache sequence
Seq.map fst source, Seq.map snd source(我在FSI中测试了1000000个元素,它也比我的计算机上的List.unzip方法慢一点)
https://stackoverflow.com/questions/37034919
复制相似问题