在Clojure中去除重复项

3
我有一个序列并试图去除重复项。
case 1: 

(vec (into #{} [1 1 2 2 3 3])) ; => [1 2 3]


case 2:

(distinct [1 1 2 2 3 3]) ; => [1 2 3]
  1. 这两种情况都能带来结果,那么哪一种更好呢?
  2. 它们之间有什么区别?

1
如果我错了,请有人纠正我,但我认为一个很大的区别是distinct将返回一个惰性序列,因此可以高效地用于非常大(甚至无限)的集合。 into在底层使用reduce,因此必须事先遍历集合(我想)。 此外,distinct将维护其元素的顺序,而into可能会混淆它们。 如果这些都不是问题,那么distinct显然具有清楚地说明它正在做什么的优点。 - jas
吹毛求疵:集合会将它们混在一起(将“the”转换为“conj-es”,并将值合并)。此外,如果没有向量,生成的集合可以充当稍后可用的函数。因此,对于“更好”的定义,可以使用已有答案中的不同之处,或者只使用集合(无向量)。 - cfrick
1个回答

6

关于差异,jas在他的评论中已经涵盖了大部分:

  1. distinct是惰性的
  2. 没有参数的distinct是一个transducer
  3. distinct维护顺序

至于哪一个更受欢迎,由于上述原因和它解释了你需要什么,所以distinct更好。我忘记哪本Lisp书谈到了这个问题(可能是Let Over Lambda),但是在两个类似的函数之间选择时,应该选择更具体的那一个。 distinct解释了你想要不同的元素。 (into #{} xs) 可能会产生不同的值,但它也容易让人误解你想要一个集合。 distinct缩小了 为什么


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