Answers:
(map vector '(1 2 3) '(4 5 6))
做你想要的:
=> ([1 4] [2 5] [3 6])
Haskell需要zipWith
(zipWith3
,,zipWith4
...)函数的集合,因为它们都必须是特定的类型;特别是,他们接受的输入列表的数量需要固定。(本zip
,zip2
,zip3
,...系列可以看作是一个专业化zipWith
的家人几倍的常见的情况)。
相反,Clojure和其他Lisps对可变arity函数具有良好的支持;map
是其中之一,可以类似于Haskell的方式用于“打结”
zipWith (\x y -> (x, y))
如上所示,在Clojure中构建“元组”的惯用方式是构造一个短向量。
(为完整起见,请注意具有某些基本扩展的Haskell确实允许使用可变arity函数;但是使用它们需要对语言有很好的了解,而普通的Haskell 98可能根本不支持它们,因此固定arity函数是可取的用于标准库。)
zip
与集合长度不同时的行为不同。Ruby将继续处理并nil
为较短的集合提供,而Clojure将在其中一个集合用完后停止处理。
zip
行为类似于Clojure的行为map
。
为了给您确切的所需,list
在两个列表之间进行映射将为您提供一个列表列表,如您的示例所示。我认为许多Clojurian都倾向于为此使用向量,尽管它可以与任何东西一起使用。输入的类型不必相同。map从它们创建序列,然后映射这些序列,以便任何可序列化的输入都能正常工作。
(map list '(1 2 3) '(4 5 6))
(map list [1 2 3] '(4 5 6))
(map hash-map '(1 2 3) '(4 5 6))
(map hash-set '(1 2 3) '(4 5 6))
内置方式将只是函数“ interleave”:
(interleave [1 2 3 4] [5 6 7 8]) => [1 5 2 6 3 7 4 8]
(partition 2 (interleave [1 2 3 4][5 6 7 8]))
有一个名为zipmap的函数,可能具有相似的效果,(zipmap (1 2 3)
(4 5 6))输出如下所示:{3 6,2 5,1 4}
#(apply map list%)像Python zip *函数一样转置矩阵。作为宏定义:
用户=>(defmacro py-zip [lst]`(应用地图列表〜lst))
#'user / py-zip
user =>(py-zip'(((1 2 3 4)(9 9 9 9)(5 6 7 8))))
(((1 9 5)(2 9 6)(3 9 7)(4 9 8))
用户=>(py-zip'(((1 9 5)(2 9 6)(3 9 7)(4 9 8)))
((1 2 3 4)(9 9 9 9)(5 6 7 8))
zip
Tupelo库中有一个函数:cloojure.github.io/doc/tupelo/tupelo.core.html#var-zip