2015-04-06 109 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)