【问题标题】:Clojure: applyng function on every value in a map in vector of mapsClojure:在地图向量中的地图中的每个值上应用函数
【发布时间】:2014-09-26 16:18:36
【问题描述】:

如何对地图向量中的地图中的每个值应用函数。

如果我有地图矢量

(def vector-of-maps [{:a 1 :b 2} {:a 3 :b 4}])

并且想对每个地图中的每个值应用一个函数,因此我想要相同的地图矢量,像这样

(map #(+ 1 %) vector-of-maps)

所以结果是

[{:a 2 :b 3} {:a 4 :b 5}]

而且我希望它适用于任何地图矢量,而不仅仅是这个特定的....

【问题讨论】:

    标签: vector map clojure


    【解决方案1】:
    => (defn update-map [m f] (reduce-kv (fn [m k v] (assoc m k (f v))) {} m))
    => (map #(update-map % inc) vector-of-maps)
    ({:b 3, :a 2} {:b 5, :a 4})
    

    【讨论】:

    • 可以在这里使用reduce-kv
    • @user100464 键的顺序是相反的,有没有办法改变它?
    • @user100464 有没有办法只显示地图的值。
    • @Vesna 你的输入图是无序的,输出图也是。
    【解决方案2】:

    也许

    (defn mapv-map-values [f vm]
      (letfn [(map-values [m] (zipmap (keys m) (map f (vals m))))]
        (mapv map-values vm)))
    

    ...生产

    (mapv-map-values inc [{:a 1 :b 2} {:a 3 :b 4}])
    ;[{:b 3, :a 2} {:b 5, :a 4}]
    

    map-values 函数是与 @user100464's answer 的唯一显着不同之处,它改编自 here

    【讨论】:

      【解决方案3】:

      你也可以这样做,但它很丑

      (defn dodo [m] (map (fn [map] (apply merge (for [[k v] map] (assoc {} k (inc v))))) m))
      
      (dodo [{:a 1 :b 2} {:a 3 :b 4}])
      ;({:a 2, :b 3} {:a 4, :b 5})
      

      【讨论】:

        猜你喜欢
        • 2019-10-26
        • 1970-01-01
        • 1970-01-01
        • 2011-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-20
        • 1970-01-01
        相关资源
        最近更新 更多