代码之家  ›  专栏  ›  技术社区  ›  user6473027

从Lisp中的列表中删除最后两个元素

  •  4
  • user6473027  · 技术社区  · 9 年前

    (defun my-butlast (list)
            (loop for l on list
                  while (rest l)
                  collect (first l)))
    
    2 回复  |  直到 9 年前
        1
  •  6
  •   Will Ness Derri Leahy    4 年前

    简单: 反转,弹出,弹出,反转 1.

    更有效的是,以下功能也可以发挥作用:

    (let ((list '(a b c d)))
      (loop 
        for x in list
        for y in (cddr list)
        collect x))
    

    (mapcar #'values L (nthcdr N L)) 
    

    它之所以有效,是因为对多个列表的迭代以最短列表为界。这里重要的是第二个列表的长度(我们不关心它的值),它是原始列表的长度减去N,它必须是一个 non-negative integer .注意 NTHCDR

    对于第二个示例,我使用 VALUES 作为广义单位函数的函数; MAPCAR 行为与实际相符 BUTLAST 2. nil 对于大于列表中元素数的N。实际 函数还可以处理不正确的(虚线)列表,但上面的版本不能。


    (alexandria:compose #'nreverse #'cddr #'reverse)

    2. 布特拉斯特 (ldiff list (last list n)) .我完全忘记了 LDIFF !

        2
  •  3
  •   Community Mohan Dere    6 年前

    butlast ,或者如果您愿意修改输入列表, nbutlast

    butlast返回一个列表副本,其中省略了最后n个conse。如果未提供n,则其值为1。如果列表中的conse少于n,则返回nil,对于nbutlast,则不修改列表。

    nbutlast类似于butlast,但nbutlast可以修改列表。它将cons n+1的cdr从列表末尾更改为零。

    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)
    

    事实上你调用了你的函数 我的最后一个

    CL-USER> (defun my-butlast (list)
               (butlast list 2))
    MY-BUTLAST
    CL-USER> (my-butlast (list 1 2 3 4))
    (1 2)