从一组集合中移除所有子集

3

我有一组集合元素。例如:

'([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 toset [vect] (into #{} vect)) (not(empty?(remove false?(map #(clojure.set/subset? (toset [0 1 2]) %1)(into [] (map #(toset %1) '([0 1 2 4]))))))) 这段代码根据列表是否为子集返回 true 或 false。 - durai
请注意,有一种集合类型看起来像#{0 1 2}。 - Adrian Mouat
重新阅读这个问题,我意识到它表述得很混乱。虽然描述了列表、集合和子集,但却展示了列表和向量。 - Julien Chastang
4个回答

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

2
据我所知,这是唯一正确的答案 - 其他答案似乎期望手动识别子集。 - Adrian Mouat
@Adrian Mouat,我也这么认为。 - BLUEPIXY
注意:我的答案是基于按元素数量较少的顺序排序的假设。 - BLUEPIXY

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
请注意,使用向量来编写文字序列比使用引用列表更为惯用。此外,在这种情况下,您可以直接使用集合字面量 #{[0 1 2] ...} - Alex Taggart
我认为这并没有回答问题,你不应该需要指定set2。 - Adrian Mouat
@Kugathasan,你还没有解释如何制作第二个集合。请注意,它应该通过识别是其他元素的子集的元素来自动创建。 - Adrian Mouat
@AdrianMouat:他提供了获取子集的逻辑吗?他发布了第二个集合,但没有发布逻辑。请检查问题。 - Abimaran Kugathasan
是的,Bluepixys的答案是正确的。感谢其他所有试图帮助我的人。 - durai
显示剩余2条评论

1

如果您不关心顺序,那么它应该很简单。

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

抱歉,这不是我要找的答案。可能是我没有正确表达问题。感谢您的帮助。我非常感激您的努力。 - durai
是的,我完全明白你的意思了,无论如何,希望你已经得到了所需的答案 :) - Ankur

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

(apply list ..) 可以写成 (list* ..) - kotarak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接