Fork me on GitHub
#clojure-russia
<
2017-01-06
>
artemyarulin12:01:42

чота туплю, а как мне отфильтровать вектор но получить все что отфильтровалось и все что нет (т.е. тип разделить на 2 части) (partition-by even? (range 10)) вернет 10 листов, эт не то

artemyarulin12:01:23

т.е. охота типа

(let [in (range 10)]
       [(filter even? in)
        (filter (comp not even?) in)])
;;=> [(0 2 4 6 8) (1 3 5 7 9)]

artemyarulin12:01:22

хм, (vals (group-by even? (range 10))) работает, но вроде было че еще короче не?

kronos_vano12:01:07

собственно group-by и juxt в конце

artemyarulin12:01:28

а точно, вот тут я и читалх про juxt да. Хотя оставлю group-by, как понимаю с juxt коллекция проходится 2 раза, не особо отличается от если б я 2 фильтра сделал

malch13:01:25

ничего там не проходится два раза, просто вспомогательная функция

malch13:01:23

если ты про filter + remove, тогда да

artemyarulin13:01:15

ага да я про него

artemyarulin13:01:06

хотя по ходу похер, на коленке если прогнать тест то

juxt "Elapsed time: 639.087162 msecs”
group-by "Elapsed time: 838.80575 msecs”

artemyarulin13:01:36

даже быстрее juxt, я ожидал наоборот, хотя мож тест не ахти

malch13:01:39

я бы сказал, что если тебе так нужна производительность, то напиши на loop/recur свой вариант

malch13:01:56

а иначе забей и пользуй juxt

artemyarulin13:01:12

тру, спасиб 👍

misha15:01:20

(reduce
  (fn [r i]
    (if (even? i)
      (update r 1 conj i)
      (update r 0 conj i)))
  [[] []]
  (range 10))

;; [[1 3 5 7 9] [0 2 4 6 8]]
opieop

misha15:01:12

груп бай такой же почти

(defn group-by  [f coll]
  (persistent!
    (reduce
      (fn [ret x]
        (let [k (f x)]
          (assoc! ret k (conj (get ret k []) x))))
      (transient {}) coll)))

artemyarulin15:01:10

ха, прикольно