如何摆脱列表中的重复,但保持顺序

时间:2011-11-16 03:04:38

标签: scheme racket

我在DrRacket中使用中级学生与Lambda ,我想知道如何在保持顺序的同时删除列表中的重复项。例如,(remove-dup (list 2 5 4 5 1 2))会产生(list 2 5 4 1)。到目前为止,我有这个:

(define (remove-duplicates lst)
  (cond
    [(empty? lst) empty]
    [(member? (first lst) (rest lst)) 
     (remove-duplicates (rest lst))]
    [else (cons (first lst) (remove-duplicates (rest lst)))]))

,但由于没有保留订单,因此存在问题。有人能指出我正确的方向吗?谢谢你的时间。

8 个答案:

答案 0 :(得分:11)

如果您的目标是让功能正常运行,而不是一些功课问题,那么您不需要做任何事情,只需使用remove-duplicates

Welcome to Racket v5.2.
-> (remove-duplicates (list 2 5 4 5 1 2))
'(2 5 4 1)

答案 1 :(得分:4)

这是解决方案:

(define (remove-duplicates lon)
  (foldr (lambda (x y) (cons x (filter (lambda (z) (not (= x z))) y))) empty lon))

答案 2 :(得分:0)

SRFI-1有delete-duplicates,但效率很低。 (我对Racket不太熟悉,但肯定它有SRFI-1和源......)

http://srfi.schemers.org/srfi-1/srfi-1.html#delete-duplicates

答案 3 :(得分:0)

按顺序运行列表,将每个元素插入哈希表或其他字典中。如果您尝试插入已存在于哈希表中的元素,请不要将其添加到传出列表中。

答案 4 :(得分:0)

您需要做的是以相反的顺序比较整个时间。您可以使用reverse函数以相反的顺序返回列表。这样你总是删除第二个+元素而不是第一个元素。以下是一个示例,但它使用letif而不是cond表达式。

http://www.cs.bgu.ac.il/~elhadad/scheme/duplicates.html

祝你的作业好运:))

答案 5 :(得分:0)

我不确定这是否是作业,但万一我会发布这个想法。如果没有告诉我,我可以在这里提出解决方案。

您需要的是跟踪您找到的唯一项目,您可以使用辅助列表(如累加器)来跟踪到目前为止找到的项目。

每当您查看另一个项目时,请检查它是否在辅助列表中。如果它没有将它添加到辅助列表中。

你最终会得到一个与你想要找到的相反的顺序,所以你可以(反向......)它,你会得到答案。

答案 6 :(得分:0)

嗯,我刚刚参加了一次球拍考试,:/ /

'标准'remove-duplicates工作正常,但我在drRacket中使用非常大,所以必须使用(require racket/list)加载

这是另一种方式:)

使用变异(不是真的在球拍的精神,但..它的作用。)

    (define (set l)
        (define the-set '())
            (begin (for-each
                       (lambda (x)
                            (if (member x the-set)
                                #t
                            (set! the-set (cons x the-set))))
                       l)
                   (reverse the-set)))

希望这有助于...干杯!

答案 7 :(得分:0)

老问题,但这是J-Y想法的实现。

(define (dup-rem lst)
  (cond
    [(empty? lst) empty]
    [else (cons (first lst) (dup-rem (filter (lambda (x) (not (equal? (first lst) x))) lst)))]))