找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3703|回复: 8

[选择集] (xl-remove rlst lst fz) = 排除表中重复项及属于排除列表中的项,支持精度

[复制链接]
发表于 2013-6-20 00:13:36 | 显示全部楼层 |阅读模式
函数发布
函数名称: xl-remove
调用格式: (xl-remove rlst lst fz)
参数说明: rlst为要排除的列表
lst为要处理的表
.fz=精度.
返回值:
函数简介: (xl-remove rlst lst fz) = 排除表中重复项及属于排除列表中的项,支持精度
函数来源: 原创
函数作者: 梁雄啸
适用版本: 不限 
最后更新时间: 2004.4
备注: -
演示图片: -

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

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

×
  1. ;; (xl-remove)(xl-eq)(xl-mem)(xl-rem)(xl-rems)
  2. ;| (xl-remove rlst lst fz) = 排除表中重复项及属于排除列表中的项,支持精度--------梁雄啸.2004.4
  3. 参数: rlst为要排除的列表.fz=精度.
  4. 关联: (xl-pts1 pts fuzz) = 点表去除重复点;(本函数更通用!)
  5. 例: (交点表处理-过滤重复点和与曲线首尾相同的点.返回新的点表.)
  6.   (setq rlst (list (vlax-curve-getstartpoint curobj) (vlax-curve-getendpoint curobj)))
  7.   (setq nlst (xl-remove rlst lst  0.01)) ;lst为已经求得的点表.
  8. |;
  9. (defun xl-remove ( rlst lst fz / nlst)
  10.   (mapcar '(lambda (x)
  11.        (if (not(or (xl-mem x nlst fz) (xl-mem x rlst fz)));; xl-mem
  12.            (setq nlst (append nlst (list x)))
  13.        )) lst)
  14. )
  15. ;|比较两个表lst1 ,lst2 是否相等,支持精度. 效果同equal.
  16. 例: (xl-eq '(3.01 2.9 2) '(3.02 2.82 2) 0.1) -> T;
  17.     (xl-eq '(3.01 2.9 2) '(3.02 2.82 2) 0.01) -> nil.
  18. |;
  19. (defun xl-eq (lst1 lst2 fz / i)
  20.   (equal lst1 lst2 fz)
  21. )
  22. ;|判断点元素是否在点表内.支持精度
  23. 例: (xl-mem '(3.01 2.9 2) '((3.01 2.82 2) (1 1 2)(3 2.01 0)) 0.1) -> T
  24.     (xl-mem '(3.01 2.9 2) '((3.01 2.82 2) (1 1 2)(3 2.01 0)) 0.01) -> nil
  25.     (equal "a" "a" 1);->T
  26.     (equal '(0.1 "a") '(0.2 "a") 1);->T
  27.     (equal '(0.1 "a") '(0.2 "a") 0.01);->nil
  28. |;
  29. (defun xl-mem (lst xlst fz / )
  30.   (apply 'or (mapcar '(lambda (x) (equal x lst fz)) xlst))
  31. )
  32. ;;/////////////////////////////////////////////////////////////////;;
  33. ;;------------------------简单函数---------------------------------;;
  34. ;| (xl-rem at lst ) = 表剔除元素;-------------lxx.2004.1
  35. ;提示; 用mapcar每元素做list,用append 对nil忽略的特性.
  36.        !!!等同于: (vl-remove  element-to-remove  list)
  37. (xl-rem "a" '(58 3 (a . 8) "a" 4.5)) -> (58 3 (A . 8) 4.5)
  38. |;
  39. (defun xl-rem (at lst) ;at=atom
  40.   (apply 'append (subst nil (list at) (mapcar 'list lst)))
  41. )

  42. ;| (xl-rems atlst lst ) = 表剔除多个元素;-------------lxx.2004.1
  43. ;提示; 用mapcar每元素做list,用append 对nil忽略的特性.
  44. (xl-rems '("a" 58) '(58 3 (a . 8) "a" 4.5)) -> (3 (A . 8) 4.5)
  45. |;
  46. (defun xl-rems (atlst lst) ;at=atom
  47.   (foreach n atlst (setq lst (apply 'append (subst nil (list n) (mapcar 'list lst)))))
  48. )

评分

参与人数 2D豆 +15 收起 理由
wowan1314 + 5 很给力
xshrimp + 10 很给力!经验;技术要点;资料分享奖!

查看全部评分

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

使用道具 举报

已领礼包: 137个

财富等级: 日进斗金

发表于 2013-11-18 03:32:57 | 显示全部楼层
本帖最后由 redcat2012 于 2013-11-18 21:02 编辑

{:soso_e100:}借宝地发一个比较简洁的算法{:soso__3110130392203091378_3:}
  1. ;;删除表中元素(可用于循环表)
  2. (defun removen (n lst)
  3.   (mapcar '(lambda (x)
  4.        (if (= (type x) 'list)
  5.          (removen n x)
  6.          x
  7.        ) ;_ 结束if
  8.      ) ;_ 结束lambda
  9.     (vl-remove n lst)
  10.   ) ;_ 结束mapcar
  11. ) ;_ 结束defun
  12. ;;替换表中元素(可用于循环表)
  13. ;;newitem-新元素
  14. ;;olditem-被替换元素
  15. ;;lst-需要处理的表
  16. (defun substn (newitem olditem lst)
  17.   (mapcar '(lambda (n)
  18.        (cond ((equal n olditem)
  19.         newitem
  20.        )
  21.        ((= (type n) 'list)
  22.         (substn newitem olditem n)
  23.        )
  24.        (t n)
  25.        ) ;_ 结束cond
  26.      ) ;_ 结束lambda
  27.     lst
  28.   ) ;_ 结束mapcar
  29. ) ;_ 结束defun


点评

再来一个更加给力的算法  详情 回复 发表于 2013-11-18 20:11

评分

参与人数 1D豆 +5 收起 理由
xshrimp + 5 很给力!经验;技术要点;资料分享奖!

查看全部评分

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

使用道具 举报

已领礼包: 137个

财富等级: 日进斗金

发表于 2013-11-18 20:11:41 | 显示全部楼层
本帖最后由 redcat2012 于 2013-11-18 20:16 编辑
redcat2012 发表于 2013-11-18 03:32
借宝地发一个比较简洁的算法

{:soso__3419049825043533360_4:}再来一个更加给力的算法
  1. ;|删除表中元素(可用于循环表)
  2. _$ (REMOVEN@ 1 '(1 2 3(1(1)(1)(1))))
  3. (2 3)
  4. _$ (REMOVEN@ 1 '(1 2 3(1(1)(1 12)(1))))
  5. (2 3 ((12)))
  6. _$ (REMOVEN@ 1 '(1 2 3(1 12(1 2)(1 21)(1 2((1 22)1 22)2))))
  7. (2 3 (12 (2) (21) (2 ((22) 22) 2)))
  8. |;
  9. (defun removen@  (n lst)
  10.   (mapcar '(lambda (x)
  11.        (if (= (type x) 'list)
  12.          (removen@ n x)
  13.          x
  14.        ) ;_ 结束if
  15.      ) ;_ 结束lambda
  16.     (vl-remove-if
  17.       '(lambda (a)
  18.          (if (or (equal n a)
  19.            (and (= (type a) 'list)
  20.           (= (removen@ n a) nil)
  21.            ) ;_ 结束and
  22.        ) ;_ 结束or
  23.      t
  24.          ) ;_ 结束if
  25.        ) ;_ 结束lambda
  26.       lst
  27.     ) ;_ 结束vl-remove-if
  28.   ) ;_ 结束mapcar
  29. ) ;_ 结束defun

点评

快绕晕了,bluecat 呢  详情 回复 发表于 2013-11-18 20:21
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-11-18 20:21:27 | 显示全部楼层
redcat2012 发表于 2013-11-18 20:11
再来一个更加给力的算法

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

使用道具 举报

已领礼包: 1757个

财富等级: 堆金积玉

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

使用道具 举报

已领礼包: 202个

财富等级: 日进斗金

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

使用道具 举报

已领礼包: 202个

财富等级: 日进斗金

发表于 2018-5-11 16:05:22 | 显示全部楼层
再此,顺便说一句,排序函数是好,但是效率并不高。我一个程序里,用了3次排序,排序的时间就用了2.5s,后来我不用排序了,用了(ssget  “wp” pts fillerter)的方法,速度明显加快了,整个程序用时不过1s。

点评

看什么场合用了,有些场合是必须要排序,再进行处理的,提高效率 SSGET受限于必须要显示在屏幕内  详情 回复 发表于 2018-11-10 14:16
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

发表于 2018-11-10 14:16:37 | 显示全部楼层
dyjwyqz5221 发表于 2018-5-11 16:05
再此,顺便说一句,排序函数是好,但是效率并不高。我一个程序里,用了3次排序,排序的时间就用了2.5s,后 ...

看什么场合用了,有些场合是必须要排序,再进行处理的,提高效率
SSGET受限于必须要显示在屏幕内
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 05:12 , Processed in 0.432659 second(s), 51 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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