2011-12-02 75 views
1

我發現這個線程的內容相當有用! How to delete an element from a list in schemeScheme刪除列表

我測試了推薦的代碼,它似乎刪除了它在列表中第一次出現的唯一項目。

而是說我想從列表中出現所有的項目。甚至更進一步,如果我想指定項目列表而不是要刪除的項目。

例如,如果我有一個名爲removelist函數,把兩個列表作爲參數

(define (removelist L M)) 

> (removelist '(1 2 2 3 4 5 2 2 5 6 7 8 9) '(1 2)) 
> '(3 4 5 5 6 7 8 9) 

希望這是有道理的。

+0

'(removelist'(1 2 1 2 1 3 4 5)'(1 2 1))''的結果是什麼? –

+0

結果會是'(3 4 5)。基本上,它從列表L中刪除列表M中所有出現的項目。 – AnujSuper9

回答

1

這裏使用filtermember來完成這個簡單的功能:

(define (remove-list l m) 
(filter (lambda (element) 
      (not (member element m))) 
    l)) 

下面的結果:

> (remove-list '(1 2 2 3 4 5 2 2 5 6 7 8 9) '(1 2)) 
    (3 4 5 5 6 7 8 9) 
> (remove-list '(1 2 2 3 4 5 2 2 5 6 7 8 9) '(1 2 1)) 
    (3 4 5 5 6 7 8 9) 

這段代碼需要srfi-1。希望這可以幫助。

問候,
馬特

+0

這實際上非常有幫助!非常感謝。過濾器和成員如何準確工作? – AnujSuper9

+0

檢查[filter](http://srfi.schemers.org/srfi-1/srfi-1.html#filter)和[member](http://srfi.schemers.org/srfi-1/)的文檔SRFI-1.HTML#部件)。你可以檢查'srfi-1'的其他功能[here](http://srfi.schemers.org/srfi-1/srfi-1.html#ProcedureIndex)。基本上,'filter'返回匹配謂詞的每個元素(傳遞給它的lambda函數)。如果它是列表的一部分,'member'函數返回元素,否則返回'#f'。 – Matt

+0

不要猶豫,如果它是你正在尋找的答案接受;) – Matt

0

使用簡單的遞歸和沒有內置功能,如過濾器或成員:

(define (filter_out m l) 
    (cond ((null? l) '()) 
     ((equal? (car l) m) (filter_out m (cdr l))) 
     (else (cons (car l) (filter_out m (cdr l)))) 
     )) 

測試:

(filter_out 'jay (list 'jay 'z 'jay 'dilla 'jay 'electro)) 
(filter_out '(jay z) (list '(jay z) '(jay dilla) 'jay '(electro))) 

如果你有興趣學習這種類型的編碼,請查看「The Little Schemer」。閱讀只需要幾個小時,閱讀後你將成爲遞歸的主人。