2

マップのリストがあり、マップ内のキーの 1 つが繰り返されるキーです。リストを重複除去/マージしたい。たとえば、次のようになります。

(def data [{:id 1 :a 2 :b 3 :c 4} {:id 1 :c 5 :d 6} {:id 2 :a 100 :b 101 :c 102} {:id 2 :a 103 :d 104} {:id 2 :a 200 :f 201}])

そして、私は次のようになりたいです:

[{:id 1 :a 2 :b 3 :c 5 :d 6} {:id 2 :a 200 :b 101 :c 102 :d 104 :f 201}]

(マージ/マージウィズが機能するように質問を表現しましたが、実際には、重複する値で何が起こるかはあまり気にしません。最初のインまたは最後のインが勝つ可能性があります)。

私が持っているものは次のとおりです。

(vals (apply merge-with merge (into #(hash-map (:id %) %) data)))

これは機能しますが、これを行うためのより良い、より簡潔な、またはエレガントな方法があるかどうか疑問に思っています。intoまた、シーケンスの完全なコピーを実行し、全体をメモリに強制していると思うので、パフォーマンスについても疑問に思います (元のデータは遅延シーケンスでした)。

4

1 に答える 1

2

同じマップ:idが常に連続していることが確実にわかっている場合は、 を使用partition-byして id でデータのサブシーケンスを作成し、それらのサブシーケンスをマージできます。

(map (partial apply merge) (partition-by :id data))

これは怠惰になり、後入れが勝ちます。

于 2013-05-01T15:19:53.123 に答える