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

J-Y*_*J-Y 6 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)))]))
Run Code Online (Sandbox Code Playgroud)

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

Eli*_*lay 11

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

Welcome to Racket v5.2.
-> (remove-duplicates (list 2 5 4 5 1 2))
'(2 5 4 1)
Run Code Online (Sandbox Code Playgroud)


小智 5

这是解决方案:

(define (remove-duplicates lon)
  (foldr (lambda (x y) (cons x (filter (lambda (z) (not (= x z))) y))) empty lon))
Run Code Online (Sandbox Code Playgroud)


Han*_*wak 0

SRFI-1 有delete-duplicates,尽管效率低下。(我对 Racket 不太熟悉,但它肯定有 SRFI-1,以及来源......)

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

  • 您只需在程序中添加“(require srfi/1)”即可在 Racket 中使用“srfi/1”。然而,第一个答案中提到的“remove-duplicates”甚至更容易获得——它默认存在于 Racket 中。 (2认同)