如何在Clojure中对两个列表进行差异/减法

Kre*_*tur 5 algorithm clojure set

例:

1 1 1 3 3 4 4 5 5 6  L1
1     3 3   4 5      L2
  1 1     4     5 6  Res
Run Code Online (Sandbox Code Playgroud)

约束:

  1. diff/subtract定义为L1减去(∖)L2的元素的"集合"
  2. L2始终是L1的子集(⊆)
  3. L1和L2中的元素可以有重复
  4. 元素是基元(int,string)和所有相同的类型

(clojure.set/difference) 因为(3)而在这里没有帮助.

Thu*_*ail 8

(defn diff [s1 s2]
  (mapcat
    (fn [[x n]] (repeat n x))
    (apply merge-with - (map frequencies [s1 s2]))))
Run Code Online (Sandbox Code Playgroud)

例如,给定

(def L1  [1 1 1 3 3 4 4 5 5 6])
(def L2  [1     3 3   4 5 ])
Run Code Online (Sandbox Code Playgroud)

然后

(diff L1 L2)
;(1 1 4 5 6)
Run Code Online (Sandbox Code Playgroud)