list-ref的对面? (球拍)

时间:2015-04-06 01:39:54

标签: list racket abstract higher-order-functions

是否存在与list-ref相反的任何内容,而不是选择要添加到列表中的某些值,它是否会从列表中取出值?

我基本上想做以下事情

 (list 1 2 3 4 5 6 7) (list 3 6 7) -> (list 1 2 4 5)

列表2中的值从列表1中删除。 (优选的)

因为我总是从一个从1到n的列表开始, 第二个列表还可以表示应该删除列表1上的数字的位置/位置。 (不太喜欢)

我正在尝试创建一个代码来操作其他函数来提供这些列表,所以请清楚代码中每个列表的“提及”,因为如果人们使用xy和z,我有时会感到困惑所以有多个lambda,本地定义等。


我在这里有一些与我想要的相反的东西,我一直试图改变它,所以不是输出y上的x元素,而是给出x上不在y上的元素。 / p>

(define (selection x y)
  (filter  (lambda (e2)
            (ormap (lambda (e1) (equal? e1 e2))
                   y))
          x))

示例:

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

有人对如何将输出更改为我需要的任何想法吗?

3 个答案:

答案 0 :(得分:2)

听起来你正在使用list作为集合。您可以改为使用Racket set,并使用set-subtract函数:

#lang racket

(set-subtract (set 1 2 3 4 5 6 7)
              (set 3 6 7))
;; => (set 1 2 4 5)

答案 1 :(得分:2)

remove我会猜测。

> (remove* (list 1 2) (list 1 2 3 2 4 5 2))
'(3 4 5)

您可以阅读doc here

答案 2 :(得分:0)

这是一个简单的递归函数,可以达到你想要的效果:

(define remove-list-from-list (lambda (list remlist)
    (cond
        [(null? list) '()]
        [(member (car list) remlist) (remove-list-from-list (cdr list) remlist)]
        [else (cons (car list) (remove-list-from-list (cdr list) remlist))])))

现在您可以这样使用它:

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