首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Clojure Core或Contrib中是否有对应的Zip函数?

在Clojure Core或Contrib中是否有对应的Zip函数?
EN

Stack Overflow用户
提问于 2010-04-07 04:52:16
回答 7查看 31.4K关注 0票数 135

在Clojure中,我想组合两个列表来给出一个配对列表,

代码语言:javascript
复制
> (zip '(1 2 3) '(4 5 6))  
((1 4) (2 5) (3 6))

在Haskell或Ruby中,该函数称为zip。实现它并不困难,但我想确保我没有遗漏Core或Contrib中的一个函数。

核心中有一个zip名称空间,但它是described as,提供对Zipper函数技术的访问,这似乎不是我想要的。

在Core中,有没有一个等价的函数可以通过这种方式组合两个或更多列表?

如果没有,是不是因为有一种惯用的方法呈现了不需要的函数?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-04-07 05:13:04

代码语言:javascript
复制
(map vector '(1 2 3) '(4 5 6))

做你想做的事:

代码语言:javascript
复制
=> ([1 4] [2 5] [3 6])

Haskell需要一个zipWith (zipWith3zipWith4,...)集合函数,因为它们都需要是特定类型的;特别是,它们接受的输入列表的数量需要固定。( zipzip2zip3,...系列可以被看作是zipWith系列的一个特化)。

相比之下,Clojure和其他Lisp对可变参数函数有很好的支持;map就是其中之一,可以用类似于Haskell的方式用于“元组”

代码语言:javascript
复制
zipWith (\x y -> (x, y))

在Clojure中构建"tuple“的惯用方法是构造一个简短的向量,如上所示。

(为了完整起见,请注意,具有一些基本扩展的Haskell确实允许使用可变的are函数;不过,使用它们需要对语言有很好的理解,而普通的Haskell 98可能根本不支持它们,因此固定的are函数对于标准库是更好的。)

票数 230
EN

Stack Overflow用户

发布于 2013-07-23 17:55:25

代码语言:javascript
复制
(partition 2 (interleave '(1 2 3) '(4 5 6))) 
=> ((1 4) (2 5) (3 6))

或者更一般地说

代码语言:javascript
复制
(defn zip [& colls]
  (partition (count colls) (apply interleave colls)))

(zip '( 1 2 3) '(4 5 6))           ;=> ((1 4) (2 5) (3 6))

(zip '( 1 2 3) '(4 5 6) '(2 4 8))  ;=> ((1 4 2) (2 5 4) (3 6 8))
票数 23
EN

Stack Overflow用户

发布于 2010-04-07 05:17:38

代码语言:javascript
复制
(map vector [1 2 3] [4 5 6])
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2588227

复制
相关文章

相似问题

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