2011-12-02 104 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”。阅读只需要几个小时,阅读后你将成为递归的主人。