map-invert,用于调整值为序列的映射

vie*_*bel 1 clojure

如何反转其值为序列的地图?在反转映射中,键是所有序列的条目(假设没有重复的键)

例如:

(map-invert-tweaked {:monday [:banana :apple]
                     :sunday [:pineapple :mango]}); {:banana :monday
                                                     :apple  :monday
                                                     :pineapple :sunday
                                                     :mango     :sunday}
Run Code Online (Sandbox Code Playgroud)

我希望这个问题是明确的.

lee*_*ski 8

你可以使用列表理解.像这样:

(defn map-invert-tweaked [m]
  (into {} (for [[k vs] m
                 v vs]
             [v k])))
Run Code Online (Sandbox Code Playgroud)

for部分是这样的:

var result = [];

for (var k in m) {
    var vs = m[k];
    for (var i = 0; i < vs.length; i++) {
        var v = vs[i]
        result.push([v, k]);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后它只是将所有这些对放入地图中

在repl中:

user> (map-invert-tweaked {:monday [:banana :apple]
                           :sunday [:pineapple :mango]})
{:banana :monday, :apple :monday, :pineapple :sunday, :mango :sunday}
Run Code Online (Sandbox Code Playgroud)