Clojure,将多个序列连成一个

时间:2013-10-25 16:36:39

标签: clojure

以下一行:(repeat 4 [2 3])

告诉我:([2 3] [2 3] [2 3] [2 3])

如何从上面的向量列表中创建一个向量或列表,以便我得到它?:[2 3 2 3 2 3 2 3]

由于

4 个答案:

答案 0 :(得分:18)

concat实际上就是你想要的功能

user> (apply concat (repeat 4 [2 3]))
(2 3 2 3 2 3 2 3)

这甚至适用于懒惰输入:

user> (take 8 (apply concat (repeat [2 3])))
(2 3 2 3 2 3 2 3)

这是另一种选择:

user> (def flatten-1 (partial mapcat identity))
#'user/flatten-1
user> (flatten-1 (repeat 4 [2 3]))
(2 3 2 3 2 3 2 3)

它与懒惰兼容,不像flatten保留任何子结构(只做一级平坦化)

user> (take 12 (flatten-1 (repeat [2 3 [4]])))
(2 3 [4] 2 3 [4] 2 3 [4] 2 3 [4])

答案 1 :(得分:6)

(take 8 (cycle [2 3]))
;; => (2 3 2 3 2 3 2 3)

答案 2 :(得分:3)

  

(flatten x)
  采用顺序事物的任何嵌套组合(列表,   矢量等)并将其内容作为单个平面序列返回   (flatten nil)返回nil。

(flatten (repeat 4 [2 3]))  ;(2 3 2 3 2 3 2 3)

答案 3 :(得分:2)

迂腐地说,你要求一个向量,所以:

(->> [2 3] cycle (take 8) vec)

我觉得循环比concat更合适(尽管它使用concat本身)因为它表示“循环通过这个序列的元素”而不是“将以下序列连接在一起”。只是我的两分钱,意见问题。