In clojure, I want to aggregate this data:
(def data [[:morning :pear][:morning :mango][:evening :mango][:evening :pear]])
(group-by first data)
;{:morning [[:morning :pear][:morning :mango]],:evening [[:evening :mango][:evening :pear]]}
My problem is that :evening and :morning are redundant.
Instead, I would like to create the following collection:
([:morning (:pear :mango)] [:evening (:mango :pear)])
I came up with:
(for [[moment moment-fruit-vec] (group-by first data)] [moment (map second moment-fruit-vec)])
Is there a more idiomatic solution?
I’ve come across similar grouping problems. Usually I end up plugging merge-with or update-in into some seq processing step:
You get a map, but this is just a seq of key-value pairs:
This solution only gets what you want if each key appears twice, however. This might be better:
Both of these feel “more functional” but also feel a little convoluted. Don’t be too quick to dismiss your solution, it’s easy-to-understand and functional enough.