2012-05-16 12 views
10

मुझे एक मूल्य का उपयोग कर मानचित्र से एक कुंजी निकालना है। क्या रिवर्स लुकअप को लागू करने के अलावा इसे करने का कोई तरीका है?मानचित्र में रिवर्स लुकअप

+3

मैं क्या एफ 2 या अधिक कुंजियों का एक ही मूल्य है? क्या आपको उनमें से केवल एक या उन सभी की आवश्यकता है? – ivant

उत्तर

3

प्रयास करें

(some #(if (= (val %) your-val) (key %)) your-map) 
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 
+1

नोट: सभी गहन उद्देश्यों के लिए, मानचित्र '{: a 1: b 1}' क्या बनता है अनिर्धारित है। – Jeremy

+0

@ जेरेमी: यह सख्ती से अपरिभाषित नहीं है, आपको विश्वसनीय रूप से '{1: a}' या '{1: b}' (जो आपको मिलता है वह हैशपैप के आंतरिक क्रम पर निर्भर करता है) का रिवर्स लुकअप प्राप्त करेगा। लेकिन मैं मानता हूं कि यदि आपके पास डुप्लिकेट मान हैं, तो शायद आप इसे कुछ विशेष उपचार देना चाहते हैं। – mikera

+0

हाँ। मेरा मतलब था कि इस पर भरोसा नहीं किया जाना चाहिए। इसके अलावा, PersistentArrayMaps के छोटे मानचित्र * अनुमानित * (जरूरी नहीं) व्यवहार कर सकते हैं जब तक कि वे एक PersistentHashMap में शामिल नहीं हो जाते हैं। लेकिन फिर, यह ऐसा कुछ नहीं है जिस पर भरोसा किया जाना चाहिए। – Jeremy

0

एक और एक:

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

(defn reverse-lookup [m k]                              
    (ffirst (filter (comp #{k} second) m))) 
25

मुझे लगता है कि map-invert सही है ऐसा करने का तरीका।

From the docs:

;; 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. 
1

आप ClojureScript उपयोग कर रहे हैं या आप एक और विकल्प :)

(zipmap (vals m) (keys m))

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)) 
संबंधित मुद्दे