我有一组集合元素。例如:
'([0 1 2][1 2 3] [4 5 6] [5 6 7] [0 1 2 3] [4 5 6 7])
我希望删除子集——
[0 1 2] [1 2 3] [4 5 6] [5 6 7]
——最终答案应为'([0 1 2 3] [4 5 6 7])
。非常感谢您的任何帮助。
提前致谢。
我有一组集合元素。例如:
'([0 1 2][1 2 3] [4 5 6] [5 6 7] [0 1 2 3] [4 5 6 7])
[0 1 2] [1 2 3] [4 5 6] [5 6 7]
——最终答案应为'([0 1 2 3] [4 5 6 7])
。(defn to-superset [ coll ]
(loop [result () coll coll]
(if (empty? coll) result
(let [x (first coll)
xs (rest coll)]
(if (some #(clojure.set/subset? x %) xs)
(recur result xs)
(recur (cons x result) xs))))))
(to-superset '(#{0 1 2} #{1 2 3} #{4 5 6} #{5 6 7} #{0 1 2 3} #{4 5 6 7}))
演示
user=> (to-superset '(#{0 1 2} #{1 2 3} #{4 5 6} #{5 6 7} #{0 1 2 3} #{4 5 6 7}))
(#{4 5 6 7} #{0 1 2 3})
(def set1 '([0 1 2][1 2 3] [4 5 6] [5 6 7] [0 1 2 3] [4 5 6 7]))
(def set2 '([0 1 2] [1 2 3] [4 5 6] [5 6 7]))
(remove (set set2) set1)
结果:
([0 1 2 3] [4 5 6 7])
#{[0 1 2] ...}
。 - Alex Taggart如果您不关心顺序,那么它应该很简单。
(def a '( [1 2] [3 4] [5 6] ))
(def b '( [1 2] [33 34] [5 6] ))
(list* (set (concat a b)))
(apply list
(difference
(into #{}
'([0 1 2] [1 2 3] [4 5 6] [5 6 7] [0 1 2 3] [4 5 6 7]))
(into #{}
'([0 1 2] [1 2 3] [4 5 6] [5 6 7]))))
(apply list ..)
可以写成 (list* ..)
。 - kotarak