将一个序列展开为由重复元素组成的序列(Clojure)

9
在Clojure中,如何将一个序列分成由重复元素组成的子序列?例如:
[1 2 2 3 3 3 4 2 2 1 1 1]

to

[[1] [2 2] [3 3 3] [4] [2 2] [1 1 1]]

我一直在尝试通过一些例子来更好地理解Clojure,但是这个例子卡住了我很长时间。

2个回答

14
user> (partition-by identity [1 2 2 3 3 3 4 2 2 1 1 1])
((1) (2 2) (3 3 3) (4) (2 2) (1 1 1))

user> (vec (map vec (partition-by identity [1 2 2 3 3 3 4 2 2 1 1 1])))
[[1] [2 2] [3 3 3] [4] [2 2] [1 1 1]]

太棒了!我甚至不知道有这样一个函数(identity)存在。谢谢! - aeter
你可以使用clojure.walk函数来代替(vec (map vec ...)),具体为:(clojure.walk/walk vec vec ...) - amalloy
现在可以使用mapv代替map vec... - Jack Westmore

2

(map (juxt count first) (partition-by identity [1 1 1 3 2 2]))

((3 1) (1 3) (2 2))

1个数值为1的连续序列,后跟1个数字3,然后是2个数值为2的连续序列!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接