2015-04-06 92 views
0

我知道如何让一个函数删除所有重复项,但这不是我的问题。我想保留所有独特的/没有重复的东西。删除所有非重复项(球拍)

这将是特别好,如果有人可以在他们的反应使用抽象/高阶函数

所以这里有几个例子;

'(1 1 1 2 2 2 3 4 5) - >'(3 4 5)

'(1 1 1 2 2 2) - >空

'(2 3 4) - >'(2 3 4)

+0

复制http://stackoverflow.com/questions/21298989/how-to-remove-all-the-duplicates-in-a-list-using-scheme-only-abstract-list-func – soegaard

+0

@soegaard不是重复 –

+0

http://stackoverflow.com/questions/5751559/how-to-remove-non-duplicate-elements-from-a-list-in-scheme – soegaard

回答

1

这是在Racket中使用bagifyiterations and comprehensions的惯用的O(n)解决方案。诀窍是计数多少次在那里的每一个元素,而只服用那些只有一个:

(define (bagify lst) 
    (foldl (lambda (key ht) 
      (hash-update ht key add1 0)) 
     #hash() lst)) 

(define (non-dups lst) 
    (for/list ([key+value (in-hash-pairs (bagify lst))] 
      #:when (= (cdr key+value) 1)) 
    (car key+value))) 

例如:

(non-dups '(1 1 1 2 2 2 3 4 5)) 
=> '(3 4 5) 

(non-dups '(1 1 1 2 2 2)) 
=> '() 

(non-dups '(2 3 4)) 
=> '(2 3 4) 
+0

@FateKyougo做了任何答案可以帮助你解决问题吗?请不要忘记给我们一些反馈;) –

0
#lang racket 

(define (elements xs) 
    (set->list (list->set xs))) 

(define (duplicates xs) 
    (elements 
    (for/fold ([xs xs]) ([u (elements xs)]) 
    (remove u xs)))) 

(define (uniques xs) 
    (remove* (duplicates xs) xs)) 

(define (remove-duplicates xs) 
    (remove* (duplicates xs) xs)) 

(define (remove-non-duplicates xs) 
    (remove* (uniques xs) xs)) 

(define xs '(1 1 1 2 3 4 4)) 
(uniques xs) 
(duplicates xs) 
(remove-duplicates xs) 
(remove-non-duplicates xs) 

输出:

'(2 3) 
'(4 1) 
'(2 3) 
'(1 1 1 4 4)