找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1433|回复: 9

[LISP函数]:去除表中所有指定元素。

[复制链接]

已领礼包: 593个

财富等级: 财运亨通

发表于 2003-5-20 10:03:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

  1. ;;移除表中所有相同元素
  2. ;|;
  3. ;;;drop
  4. ;;;从列表中移去指定的元素
  5. ;;;参数
  6. ;;;一个列表和要从列表中移去的元素
  7. ;;;示例
  8. ;;;(drop 10 '(6 8 10 12))
  9. (defun drop (lst item)
  10.   (append (reverse (cdr (member item (reverse lst))))
  11.           (cdr (member item lst))
  12.   )
  13. )
  14. |;
  15. ;自 drop 函数
  16. (defun mdrop (lst item / nlst)
  17.   (while lst                               
  18.     (if        (/= (car lst) item)
  19.       (if nlst
  20.         (setq nlst (append (list (car lst)) nlst))
  21.         (setq nlst (list (car lst)))
  22.       )
  23.     )
  24.     (setq lst (cdr lst))
  25.   )
  26.   (reverse nlst)
  27. )
  28. ;|;
  29. (defun massoc (key alist / x nlist)
  30.   (foreach x alist
  31.     (if        (eq key (car x))
  32.       (if (< (atof (getvar "acadver")) 15.0);;用于实体表时 14和2000+的表有所不同
  33.         (setq nlist (cons (append (cdr x)) nlist))
  34.         (setq nlist (cons (append (cdr x) '(0)) nlist))
  35.       )
  36.     )
  37.   )
  38.   (reverse nlist)
  39. )
  40. |;
  41. ;;自massoc
  42. (defun mRemoveItem (lst item / nlst)
  43.   (foreach x lst
  44.     (if        (/= x item)
  45.       (if nlst
  46.         (setq nlst (append (list x) nlst))
  47.         (setq nlst (list x))
  48.       )
  49.     )
  50.   )
  51.   (reverse nlst)
  52. )
  53. ;;
  54. ;;;removeNth
  55. ;;;从列表中删除指定的元素。
  56. ;;;参数
  57. ;;;index:列表中所要删除的元素的索引号(由0开始)。
  58. ;;;lst:列表。
  59. ;;;返回值
  60. ;;;删除指定元素后的列表。
  61. ;;;示例
  62. ;;;(removeNth 3 '(1 2 3 3))
  63. ;|(defun removeNth (index lst / c)
  64.   (setq c -1)
  65.   (apply 'append
  66.          (mapcar '(lambda (x)
  67.                     (if        (/= (setq c (1+ c)) index)
  68.                       (list x)
  69.                     )
  70.                   )
  71.                  lst
  72.          )
  73.   )
  74. )|;
  75. ;;自removeNth
  76. (defun mRemoveItem (item lst)
  77.   (apply 'append
  78.          (mapcar '(lambda (x)
  79.                     (if        (/= x item)
  80.                       (list x)
  81.                     )
  82.                   )
  83.                  lst
  84.          )
  85.   )
  86. )
  87. ;;最简单的
  88. (defun mRemoveItem (item lst)
  89.   (vl-remove-if '(lambda (x) (= x item)) lst)
  90. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 488个

财富等级: 日进斗金

发表于 2003-5-25 16:47:12 | 显示全部楼层

Re: [LISP函数]:去除表中所有指定元素。

最初由 eachy 发布
[B;;最简单的
(defun mRemoveItem (item lst)
  (vl-remove-if '(lambda (x) (= x item)) lst)
)[/B]



(= x item)用的不好,弄个实体名试试?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-5-26 00:25:05 | 显示全部楼层
用equal吧
试了一下,用equal也未能解决aeo提出的问题.变通一下
....
(if (= (type item) 'ENAME)
  (vl-remove-if '(lambda (x) (equal (entget x) (entget item))) lst)
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-5-26 09:16:55 | 显示全部楼层
高手们的问题把我弄糊涂了...
删除表中的指定元素, 不就是数值, 字符, 实体名,子表,表达式...吗?  我用(vl-remove element list) 都可以呀? 能否把问题的来龙去脉说得清楚些, 也好让我们从中学习点什么?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2003-5-26 18:56:18 | 显示全部楼层
最初由 lsjjm 发布
[B]高手们的问题把我弄糊涂了...
删除表中的指定元素, 不就是数值, 字符, 实体名,子表,表达式...吗?  我用(vl-remove element list) 都可以呀? 能否把问题的来龙去脉说得清楚些, 也好让我们从中学习点什么? [/B]

的确用 vl-remove 一个函数就可以了,我还得继续努力学习呀,谢谢指教。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-1-21 09:59:19 | 显示全部楼层
(defun drop (lst item)
  (append (reverse (cdr (member item (reverse lst))))
          (cdr (member item lst))
  )
)
对表中有重复元素出错如(10 5 31 10 2) 去掉10

另外补充一种写法
(defun removeitem (item lst)
(apply 'append (subst nil (list item) (mapcar 'list lst)))
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-3-6 03:28:40 | 显示全部楼层
消除重复元素可直接使用acet函数:
(acet-list-remove-duplicates (list "d" "s" "s" "d" "d") nil) 返回 ( "d" "s")
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-4-30 17:41:03 | 显示全部楼层
大家的程序都很好
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2009-3-30 08:45:08 | 显示全部楼层
如何修改,让他适用于嵌套表 呢?

我最近写了一个可以适用于任何嵌套表的函数,改天贴上来!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-5-1 14:00:38 | 显示全部楼层
这么好的函数,一定支持
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-22 06:55 , Processed in 0.353075 second(s), 49 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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