如何将列表转换为clojure中后续元素对的列表?

时间:2013-12-14 20:21:20

标签: clojure

clojure中是否有一个函数可以执行以下操作:

(_ '(1 2 3 4 5)) => '((1 2) (2 3) (3 4) (4 5))

我很确定我早些时候遇到过这样的事情......不记得它是什么。

3 个答案:

答案 0 :(得分:7)

您可以使用内置partition功能

来完成此操作
> (partition 2 1 '(1 2 3 4 5))
((1 2) (2 3) (3 4) (4 5))

但是当人们要求“所有对”时,他们通常意味着“所有组合”。如果您需要所有组合 - 请使用math.combinatorics

答案 1 :(得分:0)

像这样:

(defn pairs [coll]
  (map list coll (next coll)))

(pairs '(1 2 3 4 5))
;;=> ((1 2) (2 3) (3 4) (4 5))

答案 2 :(得分:0)

对于所有对都有combinatorics更通用的解决方案(但我知道这不是你的例子所做的)。

Clojure=> (combinations '(a b c) 2)
((a b) (a c) (b c))
Clojure=> (combinations '(a b c d e) 3)
((a b c) (a b d) (a b e) (a c d) (a c e) (a d e) (b c d) (b c e) (b d e) (c d e))