在clojure中,如何反转地图层次结构

vie*_*bel 4 clojure

clojure,我有一张地图,包含每天,每个水果,吃水果的数量.我想"反转地图的层次结构"并返回相同的数据,但果实位于层次结构的顶部.

我将通过一个例子来解释:

(map-reverse-hierarchy {:monday {:banana 2 :apple 3} 
                        :tuesday {:banana 5 :orange 2}})
; => {:orange {:tuesday 2},
;     :banana {:tuesday 5, :monday 2},
;     :apple {:monday 3}}
Run Code Online (Sandbox Code Playgroud)

slo*_*oth 7

你可以使用列表理解和一些解构,比如

user=> (->> (for [[day consum] data 
  #_=>            [fruit amount] consum]
  #_=>         {fruit {day amount}})
  #_=>      (apply merge-with conj))
{:orange {:tuesday 2}, :banana {:tuesday 5, :monday 2}, :apple {:monday 3}}
user=>
Run Code Online (Sandbox Code Playgroud)

或者使用函数+ mapcat代替:

(defn flip [[day consum]]
    (map (fn [[fruit amount]] {fruit {day amount}}) consum))

(apply merge-with conj (mapcat flip data))
Run Code Online (Sandbox Code Playgroud)


Jua*_*uel 4

我的解决方案首先转置嵌套映射的各个部分,然后将它们全部合并。

{k1 {k2 v}}这些片段从到调换{k2 {k1 v}},然后由apply merge-with conj

(defn map-reverse-hierarchy [mm]
   (apply merge-with conj
     (for [[k1 m] mm [k2 v] m] {k2 {k1 v}})))
Run Code Online (Sandbox Code Playgroud)