我需要从公共(public)列表中的列表中删除最后两个元素,但我只能删除一个。有什么办法?
(defun my-butlast (list)
(loop for l on list
while (rest l)
collect (first l)))
最佳答案
简单:反向、流行、流行、反向 ;-) 1
更有效的是,以下工作也有效:
(let ((list '(a b c d)))
(loop
for x in list
for y in (cddr list)
collect x))
对于一些任意的 L 和 N,也可以这样写:
(mapcar #'values L (nthcdr N L))
它之所以有效,是因为对多个列表的迭代受到最短列表的限制。这里重要的是第二个列表的长度(我们不关心它的值),它是原始列表的长度减去 N,当该值为正时,否则为零。请注意
NTHCDR
方便地使用大于参数中给出的列表长度的大小。对于第二个示例,我使用 VALUES
用作广义恒等函数; MAPCAR
仅使用计算值的主值,因此可以按需要工作。行为与实际
BUTLAST
一致 2 函数,返回 nil
对于 N 大于列表中的元素数。实际BUTLAST
函数也可以处理不正确的(点)列表,但上面的版本不能。1.
(alexandria:compose #'nreverse #'cddr #'reverse)
2.
BUTLAST
被指定为等同于 (ldiff list (last list n))
.我完全忘记了 LDIFF
的存在!
关于common-lisp - 从 Lisp 列表中删除最后两个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45229614/