11

値を使用してマップからキーを抽出する必要があります。逆引き参照を自分で実装する以外に、これを行う方法はありますか?

4

6 に答える 6

26

map-invertそれが正しい方法だと思います。

ドキュメントから:

;; Despite being in clojure.set, this has nothing to do with sets. 

user=> (map-invert {:a 1, :b 2})
{2 :b, 1 :a}

;; If there are duplicate keys, one is chosen:

user=> (map-invert {:a 1, :b 1})
{1 :b}

;; I suspect it'd be unwise to depend on which key survives the clash.
于 2012-10-26T01:32:07.837 に答える
6

2行の機能を使用すると、マップを非常に簡単に反転できます。

(defn reverse-map [m]
  (into {} (map (fn [[a b]] [b a]) m)))

(def a {:a 1 :b 2 :c 3})

(reverse-map a)
=> {1 :a, 3 :c, 2 :b}

((reverse-map a) 1)
=> :a
于 2012-05-16T04:49:42.550 に答える
3

試す

(some #(if (= (val %) your-val) (key %)) your-map) 
于 2012-05-16T06:46:45.247 に答える
2

ClojureScriptを使用している場合、またはもう1つ代替が必要な場合:)

(zipmap (vals m) (keys m))

于 2015-08-12T09:43:31.557 に答える
0

もう1つ:

(defn reverse-map [m]                                                                                                                          
  (apply hash-map  (mapcat reverse m)))  

(defn reverse-lookup [m k]                                                                                                                     
  (ffirst (filter (comp #{k} second) m)))   
于 2012-06-08T21:18:25.940 に答える
0

キーを保持したい場合は、マップを反転するだけで、古いキーをセット/リストなどに収集することをお勧めします...

(defn map-inverse [m]
  (reduce (fn [m' [k v]] (update m' v clojure.set/union #{k})) {} m))

(defn map-inverse [m]
  (reduce (fn [m' [k v]] (update m' v conj k)) {} m))
于 2017-03-13T19:22:23.690 に答える