删除集合列表中的所有子集

时间:2011-11-17 04:32:19

标签: clojure set subset

我有一个set元素列表。例如:

'([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])

非常感谢任何帮助。

提前致谢。

4 个答案:

答案 0 :(得分:6)

(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})

答案 1 :(得分:2)

(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])

答案 2 :(得分:1)

应该如此简单(如果你不关心订购)

(def a '( [1 2] [3 4] [5 6] ))
(def b '( [1 2] [33 34] [5 6] ))
(list* (set (conc­at a b)))

答案 3 :(得分:-1)

(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]))))