मुझे एक मूल्य का उपयोग कर मानचित्र से एक कुंजी निकालना है। क्या रिवर्स लुकअप को लागू करने के अलावा इसे करने का कोई तरीका है?मानचित्र में रिवर्स लुकअप
उत्तर
प्रयास करें
(some #(if (= (val %) your-val) (key %)) your-map)
आप एक 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
नोट: सभी गहन उद्देश्यों के लिए, मानचित्र '{: a 1: b 1}' क्या बनता है अनिर्धारित है। – Jeremy
@ जेरेमी: यह सख्ती से अपरिभाषित नहीं है, आपको विश्वसनीय रूप से '{1: a}' या '{1: b}' (जो आपको मिलता है वह हैशपैप के आंतरिक क्रम पर निर्भर करता है) का रिवर्स लुकअप प्राप्त करेगा। लेकिन मैं मानता हूं कि यदि आपके पास डुप्लिकेट मान हैं, तो शायद आप इसे कुछ विशेष उपचार देना चाहते हैं। – mikera
हाँ। मेरा मतलब था कि इस पर भरोसा नहीं किया जाना चाहिए। इसके अलावा, PersistentArrayMaps के छोटे मानचित्र * अनुमानित * (जरूरी नहीं) व्यवहार कर सकते हैं जब तक कि वे एक PersistentHashMap में शामिल नहीं हो जाते हैं। लेकिन फिर, यह ऐसा कुछ नहीं है जिस पर भरोसा किया जाना चाहिए। – Jeremy
एक और एक:
(defn reverse-map [m]
(apply hash-map (mapcat reverse m)))
(defn reverse-lookup [m k]
(ffirst (filter (comp #{k} second) m)))
मुझे लगता है कि 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.
आप ClojureScript उपयोग कर रहे हैं या आप एक और विकल्प :)
(zipmap (vals m) (keys m))
आप कुंजी रखना चाहते हैं की जरूरत है, यह बेहतर है बस नक्शे को उलटने के लिए , लेकिन एक सेट/सूची आदि में पुरानी चाबियाँ इकट्ठा करें ...
(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))
मैं क्या एफ 2 या अधिक कुंजियों का एक ही मूल्य है? क्या आपको उनमें से केवल एक या उन सभी की आवश्यकता है? – ivant