5

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

给了我这个:([2 3] [2 3] [2 3] [2 3])

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

谢谢

4

4 回答 4

19

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])
于 2013-10-25T16:43:26.720 回答
6
(take 8 (cycle [2 3]))
;; => (2 3 2 3 2 3 2 3)
于 2013-10-25T17:21:24.850 回答
3

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

(flatten (repeat 4 [2 3]))  ;(2 3 2 3 2 3 2 3)
于 2013-10-25T16:47:59.357 回答
2

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

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

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

于 2013-10-26T20:19:40.207 回答