Clojure 对于值为序列的贴图,使用调整进行贴图反转

Clojure 对于值为序列的贴图,使用调整进行贴图反转,clojure,Clojure,如何反转值为序列的贴图? 在反向映射中,键是所有序列的条目(假设没有重复键) 例如: (map-invert-tweaked {:monday [:banana :apple] :sunday [:pineapple :mango]}); {:banana :monday :apple :monday

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

例如:

(map-invert-tweaked {:monday [:banana :apple]
                     :sunday [:pineapple :mango]}); {:banana :monday
                                                     :apple  :monday
                                                     :pineapple :sunday
                                                     :mango     :sunday}

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

您可以使用列表理解。像这样:

(defn map-invert-tweaked [m]
  (into {} (for [[k vs] m
                 v vs]
             [v k])))
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]);
    }
}
for
部件的功能如下:

(defn map-invert-tweaked [m]
  (into {} (for [[k vs] m
                 v vs]
             [v k])))
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]);
    }
}

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

(defn map-invert-tweaked [m]
  (into {} (for [[k vs] m
                 v vs]
             [v k])))
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]);
    }
}
for
部件的功能如下:

(defn map-invert-tweaked [m]
  (into {} (for [[k vs] m
                 v vs]
             [v k])))
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]);
    }
}
加入元音一代! 是的,上述方法可行,但使用实际单词作为变量名更容易阅读:

(defn invert-keylist-map [keylist-map]
  (into {} 
    (for [ [curr-key  value-list]   keylist-map
            curr-value              value-list]
      [curr-value curr-key] )))
更好的方法是使用以下方式描述输入和输出的形状:

(ns ...
  (:require [schema.core :as s] ))

(s/defn invert-keylist-map :- { s/Any s/Any }  ; result is a map of anything -> anything
  [keylist-map  :- { s/Any [s/Any] } ]  ; input is a map of anything -> list-of-anything
  (into {} 
    (for [ [curr-key  value-list]   keylist-map
            curr-value              value-list]
      [curr-value curr-key] )))
加入元音一代! 是的,上述方法可行,但使用实际单词作为变量名更容易阅读:

(defn invert-keylist-map [keylist-map]
  (into {} 
    (for [ [curr-key  value-list]   keylist-map
            curr-value              value-list]
      [curr-value curr-key] )))
更好的方法是使用以下方式描述输入和输出的形状:

(ns ...
  (:require [schema.core :as s] ))

(s/defn invert-keylist-map :- { s/Any s/Any }  ; result is a map of anything -> anything
  [keylist-map  :- { s/Any [s/Any] } ]  ; input is a map of anything -> list-of-anything
  (into {} 
    (for [ [curr-key  value-list]   keylist-map
            curr-value              value-list]
      [curr-value curr-key] )))