明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5357|回复: 25

[提问] 如何删除list中,指定位置的元素,返回删除后的列表?

[复制链接]
发表于 2018-11-8 14:40 | 显示全部楼层 |阅读模式
本帖最后由 l282027798 于 2018-11-8 14:51 编辑

如题,lisp有没有现成的函数?
非要自己写一个吗?感觉自己写的太浪费内存了,怕卡。
一个循环套一个循环的。


;删除list指定元素
(defun dele_lst(lst n)
    (setq j 0 lss (list))
    (repeat (length lst)
        (if (/= j (- n 1))    ;如果不是指定元素
            (setq lss (cons (nth j lst) lss))
        )
        (setq j (+ j 1))
    )
    (reverse lss)
)

(setq lst (list 1 2 3 4 5 6 7))
(princ (dele_lst lst 3))


;返回结果  (1 2 4 5 6 7)




发表于 2018-11-8 17:36 | 显示全部楼层
  1. (defun del_position(lst n / i l a)
  2.   (setq l(length lst)
  3.         i(if(<(+ n n)l)-1 l))
  4.   (if(< i n)
  5.     (progn(while(<(setq i(1+ i))n)
  6.             (setq a(cons(car lst)a)lst(cdr lst)))
  7.       (append(reverse a)(cdr lst)))
  8.     (progn(setq lst(reverse lst))
  9.       (while(>(setq i(1- i))n)
  10.             (setq a(cons(car lst)a)
  11.                   lst(cdr lst)))
  12.       (append(reverse(cdr lst))a))))

(DEL_POSITION'(0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9)6)
(0 0 1 1 2 2 3 4 4 5 5 6 6 7 7 8 8 9 9)

评分

参与人数 1明经币 +1 收起 理由
ysq101 + 1 活捉大神一位

查看全部评分

发表于 2018-11-12 15:48 | 显示全部楼层
yanshengjiang 发表于 2018-11-12 13:21
他要的是,比如说要返回第5项后面的所有项,能不能循环cdr呢?

  1. ;借用函数库
  2. ;reverse cdr (recursive) - hp
  3. (defun rcdr (n l )
  4.   (if (> n 0)(cons (nth (1- n) l) (rcdr (1- n) l ))))


  5. (setq lst '(1 2 3 4 5 6 7 8 9 10))
  6. (rcdr 4 lst)
  7. ;;;(4 3 2 1)


  8. ;;_cdr - lisperado
  9. ;;i - mode 0=包头 , 1=包尾
  10. ;;n - nth count of cdr
  11. ;;l - list
  12. ;;returns a list containing all the elements of list, except the remaining elements

  13. (defun _cdr (i n l)
  14. (vl-remove nil
  15.    (if (and (numberp i) (zerop i))
  16.     (reverse (rcdr n l ))
  17.     (rcdr n (reverse l) )
  18.     )
  19.    )
  20.   )


  21. (_cdr 0 5 lst ) ;包头
  22. ;;;(1 2 3 4 5)

  23. (_cdr 1 5 lst ) ;包尾
  24. ;;;(6 7 8 9 10)  

发表于 2018-11-12 11:08 | 显示全部楼层
本帖最后由 lisperado 于 2018-11-12 11:11 编辑

(defun nth_del (l n / i)
        (setq i 0)
        (vl-remove-if '(lambda (i)(= i n)) l)
)


hi,if symbol 'i' is localized in lambda, then 'i' holds no value, it always be nil :)

you forgot iteration??  (setq i (1+ i))

suggestion:
  1. (defun nth_del (l n / i)
  2.         (setq i -1)
  3.         (vl-remove-if ''((l) (= n (setq i (1+ i)) ) ) l)
  4. )



发表于 2018-11-8 15:52 | 显示全部楼层
本帖最后由 fangmin723 于 2018-11-8 15:55 编辑

直接用vl-remove就可以了
命令: (setq lst (vl-remove 3 '(1 2 3 4 5 6 7))) (1 2 4 5 6 7)
发表于 2018-11-8 15:52 | 显示全部楼层
本帖最后由 fangmin723 于 2018-11-8 15:53 编辑

呃,卡住了,连续回复了两次
 楼主| 发表于 2018-11-8 16:24 | 显示全部楼层
fangmin723 发表于 2018-11-8 15:52
直接用vl-remove就可以了
命令: (setq lst (vl-remove 3 '(1 2 3 4 5 6 7))) (1 2 4 5 6 7)

用vl 系列,还得 (vl-load-com) 呢
发表于 2018-11-9 08:07 | 显示全部楼层
l282027798 发表于 2018-11-8 16:24
用vl 系列,还得 (vl-load-com) 呢

呃,我没加载(vl-load-com)也能用啊,再说,就非加载的话不就一句代码的事吗,为啥弄得那么复杂
发表于 2018-11-9 08:19 | 显示全部楼层
本帖最后由 fangmin723 于 2018-11-9 13:19 编辑

(defun tt(lst loc / n nlst)
        (setq n 0 nlst nil)
        (mapcar '(lambda(x) (if (/= n loc) (progn (setq nlst (cons x nlst) n (+ n 1))) (progn (setq n (+ n 1)))) (prin1)) lst)
        (reverse nlst)
)


命令: (tt '(0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9) 6)
(0 0 1 1 2 2 3 4 4 5 5 6 6 7 7 8 8 9 9)




发表于 2018-11-11 23:48 | 显示全部楼层
I choice with <1000 items list :
  1. (defun nth_del (l n / i)
  2.         (setq i 0)
  3.         (vl-remove-if '(lambda(i)(= i n)) l)
  4. )
发表于 2018-11-12 10:58 | 显示全部楼层
fangmin723 发表于 2018-11-8 15:52
直接用vl-remove就可以了
命令: (setq lst (vl-remove 3 '(1 2 3 4 5 6 7))) (1 2 4 5 6 7)

标题是指定位置而不是 指定数值

虽然如此,也请注意vl-remove会把所有重复也删除!
(setq lst  (0 0 1 1 2 3 4 4 5 5 6 6 7 7 5 5 8 8 9 9))

(vl-remove 5 lst)
'(0 0 1 1 2 2 3 4 4 6 6 7 7 8 8 9 9)

小心类似 subst 也要多注意

举例:
(subst nil 5 lst)
(0 0 1 1 2 2 3 4 4 nil nil 6 6 7 7 nil nil 8 8 9 9)

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-5 03:56 , Processed in 0.204682 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表