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))