Common lisp 从Lisp中的列表中删除最后两个元素
我需要从公共列表中的列表中删除最后两个元素,但我只能删除一个。怎么走Common lisp 从Lisp中的列表中删除最后两个元素,common-lisp,Common Lisp,我需要从公共列表中的列表中删除最后两个元素,但我只能删除一个。怎么走 (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
(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,当该值为正时,或者为零。请注意,可以方便地处理大于参数中给出的列表长度的大小。在第二个例子中,我使用该函数作为广义恒等式函数;仅使用计算值的主值,因此这可以根据需要工作。
该行为与实际的2函数一致,该函数返回大于列表中元素数N的nil
。实际的BUTLAST
功能也可以处理不正确的(虚线)列表,但上述版本不能
1.
(亚历山大:撰写#nreverse#cddr#reverse)
2.
但最后一个被指定为等同于(ldiff list(last list n))
。我完全忘记了生命的存在 标准中有这样一个函数:,或者如果您愿意修改输入列表,
butlast返回一个列表副本,其中省略了最后n个conses。如果未提供n,则其值为1。如果列表中的conses少于n,则返回nil,如果是nbutlast,则不会修改列表
nbutlast类似于butlast,但nbutlast可以修改列表。它将cons n+1的cdr从列表末尾更改为nil
示例:
CL-USER> (butlast '(1 2 3 4 5) 2)
(1 2 3)
CL-USER> (nbutlast (list 6 7 8 9 10) 2)
(6 7 8)
你调用了你的函数my butlast这一事实表明你可能知道这个函数,但你没有提到不想使用这个函数,所以我认为这仍然是一个公平的游戏。完成它很容易:
CL-USER> (defun my-butlast (list)
(butlast list 2))
MY-BUTLAST
CL-USER> (my-butlast (list 1 2 3 4))
(1 2)
while(rest(restl))
?@melpomene我在尝试不同的方法来实现它(如果原子(1234)5)移除:计数2:从t端开始)
=>(1234))
@jkiiski你能不能将它集成到a函数中。plz MyList=(ABCD)…我正在尝试编写一个函数来从列表中移除CD。这样它就变成了Mylist=(A B)(subseq list:start 0:end(-(length list)2))
-这将是我的goto解决方案,在这种情况下,它也可以与paincddr一起工作。这是如何编写的,尽管您可以将其作为一个通用函数,将购买金额作为一个参数。@Sylwester是的,在示例中使用CDDR并在之后进行概括更有意义。谢谢,没必要这样。但Last存在于标准中,并接受可选的第二个参数,该参数指定要排除的元素数。我补充说。