6

私は2つのマップの配列を持っています

1つ目は[{:a 1 :b 2 :d 6} {:a 2 :b 2} {:a 7 :b 7}]

2番目は[{:a 3 :c 3 :e 9 :y 7} {:a 2 :b 6 :c 8}]

ieの値に応じて、a2 番目の配列で一致する場合、「2 番目のマップ」は「1 番目のマップ」とマージされ、マップの結果の配列は次のようになります。

解像度は[{:a 1 :b 2 :d 6} {:a 2 :b 6 :c 8} {:a 7 :b 7} {:a 3 :c 3 :e 9 :y 7}]

誰でもこれについて私を助けることができますか?前もって感謝します。

4

3 に答える 3

6

どうぞ:

user> (def xs [{:a 1 :b 2 :d 6} {:a 2 :b 2} {:a 7 :b 7}])
#'user/xs
user> (def ys  [{:a 3 :c 3 :e 9 :y 7} {:a 2 :b 6 :c 8}])
#'user/ys
user> (for [[a ms] (group-by :a (concat xs ys))] (apply merge ms))
({:a 1, :b 2, :d 6} {:a 2, :c 8, :b 6} {:a 7, :b 7} {:y 7, :a 3, :c 3, :e 9})
于 2012-04-18T20:53:20.707 に答える
4

このデータ構造は私には非常に扱いにくいように見えますが、私の見解は次のとおりです。

(defn key-by-a [coll]
  "Convert a list of maps to a map of maps keyed by their vals at :a"
  (apply hash-map (mapcat (juxt :a identity) coll)))

(defn merge-map-lists [l1 l2]
  (->> [l1 l2]
    (map key-by-a)
    (apply merge-with merge)
    (vals)))

それがしないことの1つは、入力リストの順序を維持することですが、どちらのリストが決定するかが明確ではないため(両方とも同じキーが異なる順序である可能性があります)、私はそれを省略しました.

于 2012-04-18T14:27:43.200 に答える