首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何做Seq.unzip

如何做Seq.unzip
EN

Stack Overflow用户
提问于 2016-05-04 18:04:57
回答 4查看 2K关注 0票数 8

我有一个foo: seq<int*int>

我想拆分元组项,然后将结果存储到两个变量中,每个变量都是一个seq<int>

我想知道是否有更漂亮的方法可以做到这一点。

代码语言:javascript
复制
let item1, item2 = foo |> ?????

我目前的解决方案:

代码语言:javascript
复制
let item1 = foo |> Seq.map(fun (f1,_) -> f1)
let item2 = foo |> Seq.map(fun (_,f2) -> f2)
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-05-04 18:31:34

遗憾的是,语言中没有附带的Seq.unzip函数,尽管列表(List.unzip)和数组(Array.unzip)的等价物确实存在。

有几种方法可以定义这样的函数,其中一种方法是:

代码语言:javascript
复制
let unzip sequence =
    let (lstA, lstB) = 
        Seq.foldBack (fun (a,b) (accA, accB) -> 
            a::accA, b::accB) sequence ([],[])
    (Seq.ofList lstA, Seq.ofList lstB)

或者,如果您不关心在列表之间来回切换,您可以这样做:

代码语言:javascript
复制
let item1, item2 = 
    let it1, it2 = 
        foo 
        |> List.ofSeq 
        |> List.unzip 
    (Seq.ofList it1, Seq.ofList it2)
票数 8
EN

Stack Overflow用户

发布于 2016-05-04 18:24:46

你想得到的是两个不同的序列,所以你不会找到一个更漂亮的方法来做到这一点。您所拥有的几乎是足够的,但是您可以通过使用fstsnd分别取笑元组的第一项和第二项,并将这两个表达式写在同一行上,使其更短一些:

代码语言:javascript
复制
let items1, items2 = foo |> Seq.map fst, foo |> Seq.map snd
票数 5
EN

Stack Overflow用户

发布于 2016-07-26 21:26:35

要添加TheInnerLight的答案,正式文件告诉我们:

Seq.zip和Seq.zip3使用两个或三个序列并产生一个元组序列。这些函数类似于列表中可用的相应函数。没有相应的功能将一个序列分离成两个或多个序列。如果序列需要此功能,请将序列转换为列表并使用List.unzip

我的自发解决方案(类似于OP的方法)应该是编写:

代码语言:javascript
复制
let unzip sequence = 
    let source = Seq.cache sequence
    Seq.map fst source, Seq.map snd source

(我在FSI中测试了1000000个元素,它也比我的计算机上的List.unzip方法慢一点)

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37034919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档