如何从列表中删除第一个元素?

时间:2010-03-19 22:17:36

标签: list scheme

如何从Scheme?

中删除列表中的第一个元素

假设我有以下列表

'((apple bob car) (cat dig) (e)))

我如何摆脱apple而将其余部分单独留下?

4 个答案:

答案 0 :(得分:9)

Scheme中的三个基本列表操作是

  • cdr,意思是'休息'或'给我列表,没有第一项'
  • car,表示“第一个”或“给我列表中的第一个项目”
  • cons,表示追加列表

假设s是列表((apple bob car)(cat dig)(e))

中间步骤

(car s)       ; (apple bob car)
(cdr (car s)) ; (bob car)
(cdr s)       ; ((cat dig) (e))

最后的表达

(cons (cdr (car s))) (cdr s))

结果

((bob car) (cat dig) (e))

答案 1 :(得分:5)

首先,要认识到你的问题有点不一致。如果你想删除列表中的第一个元素,你将留下

((cat dig) (e))

因为列表中的第一个元素是(apple bob car)

如果你试图摆脱apple,那么如果列表的头部(汽车)本身一个列表,你想用它的cdr替换它。我假设您希望无论列表的深度如何都能工作,因此您需要使用该方法进行递归(与其他答案不同)。

因此,如果第一个项目是列表,那么您需要从列表中删除第一个项目,并递归地将其添加到列表的其余部分。这似乎有效:

(define removeFirst
  (lambda (input)
    (cond
      ((list? (car input)) (cons (removeFirst (car input)) (cdr input)))
      (else (cdr input))
    )
  )
)

> (removeFirst '((apple bob car) (cat dig) (e)))
((bob car) (cat dig) (e))

答案 2 :(得分:1)

除了其他答案之外,您的问题还有一些变异,而Scheme中的列表通常是不可变的 - 甚至是列表中的列表。这就是为什么所有其他答案返回一个新列表没有你想要摆脱的元素。您可以为变量分配列表,然后使用set为同一变量分配不同的列表!但你永远不会改变你最初制作的清单。

答案 3 :(得分:0)

(cdr x)(其中'x'是列表)将为您提供除第一个元素之外的所有列表。将其应用于上述内容的问题是apple不是'((apple bob car) (cat dig) (e)))的第一个元素。您给出的是列表列表,外部列表的第一个元素是列表(apple bob car)

要仅删除“apple”,您需要弄清楚您收到的列表中的第一项本身是否为列表,如果是这样,则将包含该列表的列表与第一项删除(提示:递归) ,然后是原始列表的其余部分。如果第一个项目不是列表,那么您只需返回列表的其余部分。