Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Map 地图中的反向查找_Map_Clojure_Key Value - Fatal编程技术网

Map 地图中的反向查找

Map 地图中的反向查找,map,clojure,key-value,Map,Clojure,Key Value,我必须使用一个值从地图中提取一个键。除了自己实现反向查找,还有其他方法吗?使用双线功能,您可以非常轻松地反转地图: (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 试一试 另一个: (defn reverse-map [m]

我必须使用一个值从地图中提取一个键。除了自己实现反向查找,还有其他方法吗?

使用双线功能,您可以非常轻松地反转地图:

(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
试一试

另一个:

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

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

我认为
map invert
是正确的方法


如果您使用的是ClojureScript,或者您还需要一个选项:)


(zipmap(VAL m)(图例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))

如果两个或多个键具有相同的值怎么办?您只需要其中一个,还是全部?注意:对于所有密集用途,映射
{:a1:b1}
的内容是未定义的。@Jeremy:它不是严格未定义的,您将可靠地得到
{1:a}
{1:b}
的反向查找(您得到哪一个取决于hashmap的内部顺序)。但我同意,如果你有重复的值,你可能想给它一些特殊的处理。是的。我的意思是不应该依赖它。此外,作为PersistentArrayMaps的小映射可以具有可预测(不一定是预期的)行为,直到它们被强制为PersistentHarrayMap。但是,这也不是什么值得信赖的东西。
;; 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.
(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))