我在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)))]))
,但由于没有保留订单,因此存在问题。有人能指出我正确的方向吗?谢谢你的时间。
答案 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
函数以相反的顺序返回列表。这样你总是删除第二个+元素而不是第一个元素。以下是一个示例,但它使用let
和if
而不是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)))]))