明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 585|回复: 4

[函数] 删除列表中指定值中的一个值(若有多个重复值只删除第一个,区别于vl-remove的全部...

[复制链接]
发表于 2022-7-23 09:48 | 显示全部楼层 |阅读模式
本帖最后由 guosheyang 于 2022-8-7 09:52 编辑

       给lisp的初学者们分享个自定义函数(高手请略过) ,删除列表中指定值中的一个值(若有多个重复值只删除第一个,区别于vl-remove的全部删除),若有问题请反馈,谢谢!

;函数功能:删除表中指定值中的一个(若有多个重复值只删除第一个,区别于vl-remove的全部删除)
;参数:L列表 del_item要删除的一个元素值   
;返回值:删除一项指定值后的列表   
;测试
(ygs_del_single
  (setq L'(1 1 2 2 3 3 4 5 5 5 6 7 11 12 13 5 15 17 5 19 90 85 85 85 90 93 101))
  (setq del_item 2)
)
;主程序
(defun ygs_del_single(L del_item / NL WZ)
(if(vl-position del_item L)
  (progn
   (setq wz(vl-position del_item L ))
   (repeat wz
     (setq nl(cons(car L )nl));新表
     (setq L(cdr L))
   )
    (append(reverse nl)(cdr L))
  )
   (princ "\ndel_item不是所指定列表的成员")
)
)

代码二:简洁型
   ;(ygs_del_single L del_item)
(defun ygs_del_single(L del_item / NL)
(while(/=(car L) del_item)
     (setq nl(cons (car L) nl))
     (setq L(cdr L))
)
(append(reverse nl)(cdr L))
)




"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2022-7-24 20:31 | 显示全部楼层
本帖最后由 表骑马实开车 于 2022-7-24 20:36 编辑
guosheyang 发表于 2022-7-24 19:53
嗯   改成while循环  看起来简洁点  也可以改为mapcar的循环

(setq Ls '(1 1 2 2 3 3 4 5 5 5 6 7 11 12 13 5 15 17 5 19 90 85 85 85 90
           93 101)
)

(vv 1 ls)

(defun vv (k l)
  (vl-remove nil
             (mapcar '(lambda (x)
                        (if (= x k)
                          (setq        x nil
                                k nil
                          )
                          x
                        )
                      )
                     l
             )
  )
)

这样吗
回复 支持 1 反对 0

使用道具 举报

发表于 2022-7-24 18:55 | 显示全部楼层
本帖最后由 表骑马实开车 于 2022-7-24 19:13 编辑


(defun vv (l k / b)
  (if (vl-some '(lambda (x) (= x k)) l)
    (progn
      (while (not (= (car l) k))
        (setq b        (cons (car l) b)
              l        (cdr l)
        )
      )
      (append (reverse b) (cdr l))
    )
    (princ "\ndel_item不是所指定列表的成员")
  )
)
 楼主| 发表于 2022-7-24 19:53 | 显示全部楼层
表骑马实开车 发表于 2022-7-24 18:55
(defun vv (l k / b)
  (if (vl-some '(lambda (x) (= x k)) l)
    (progn

嗯   改成while循环  看起来简洁点  也可以改为mapcar的循环
发表于 2022-8-3 23:57 | 显示全部楼层
表骑马实开车 发表于 2022-7-24 20:31
(setq Ls '(1 1 2 2 3 3 4 5 5 5 6 7 11 12 13 5 15 17 5 19 90 85 85 85 90
           93 101)
)

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

本版积分规则

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

GMT+8, 2024-5-12 13:04 , Processed in 0.192017 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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