clojure帮助我在列表中分组项目时变得更好

时间:2014-09-23 05:50:32

标签: clojure

所以我一起攻击了这个,但我相信我有很多东西要学习clojure!我已经有了正确的答案,但对我而言,这只是一个开始。通过弄清楚我应该如何思考这个问题,帮助我更好地理解lisp。我是一个传统的OO开发者...所以lisp并没有很好地进入我的脑海。

(def v [:a :a :a :b :b :c :c :c])

(def a  (first(partition-by identity v)))
(def b (flatten(rest (partition-by identity v))))
(vec(conj (list b) a))

获取上面已编码但未使用Frankenstein语法的结果的想法。我希望你能帮助我。 我的代码的结果是: [(:a:a:a)(:b:b:c:c:c)]

2 个答案:

答案 0 :(得分:2)

这个功能怎么样?

(defn my-group [[x & _ :as xs]]
  (split-with (partial = x) xs))

让我们试试这个功能:

user> (my-group [:a :a :a :b :b :c :c :c])
;; => [(:a :a :a) (:b :b :c :c :c)]
user> (my-group ["foo" "foo" "bar" "bar" "bar" "baz" "foo"])
;; => [("foo" "foo") ("bar" "bar" "bar" "baz" "foo")]

答案 1 :(得分:1)

我的理解是你想要这样的东西:

(let [[a & r] (partition-by identity v)]                                                                                                                       
  [a (apply concat r)])