【问题标题】:opposite of list-ref? (Racket)与列表参考相反? (球拍)
【发布时间】:2015-06-10 10:31:06
【问题描述】:

有什么东西可以与 list-ref 相反,它不是选择某些值来添加到列表中,而是从列表中取出值?

我基本上想做以下事情

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

列表二中的值从列表一中删除。 (首选)

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

我正在尝试创建一个代码来操纵其他函数来生成这些列表,因此请清楚代码中“提到”每个列表的位置,因为如果人们使用 xy 和 z 和以此类推,有多个 lambda、本地定义等。


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

(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))

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

【问题讨论】:

  • 什么? list-ref 与“选择某些值添加到列表”没有太大关系。
  • 我的描述没有多大意义,我只是想说我想在某种意义上做相反的事情。

标签: list racket abstract higher-order-functions


【解决方案1】:

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

#lang racket

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

【讨论】:

  • 我还没有学过集合。你有没有办法使用抽象/高阶函数来做到这一点?
【解决方案2】:

remove 我猜会成功的。

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

您可以阅读doc here。

【讨论】:

  • remove* 可能有效,但问题是它没有在我坚持使用的语言级别上定义。你知道如何使用递归或抽象来定义吗?
  • 是的,应该不会很难。试一试,然后用你写的一些代码回来。提示:构建结果列表时使用cons。您必须检查第一个列表中的每个项目的每个第二个。每次浏览第一个列表时,请使用cdr 将其缩短以进行下一次递归调用。 .
【解决方案3】:

这是一个简单的递归函数,可以实现你想要的:

(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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    • 2015-05-12
    • 1970-01-01
    • 2019-10-29
    • 2017-09-23
    • 1970-01-01
    • 2022-01-20
    相关资源
    最近更新 更多