找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1333|回复: 5

[] (XD::List:Intersection)返回两个表共有(交集)的元素

[复制链接]

已领礼包: 20个

财富等级: 恭喜发财

发表于 2019-1-22 11:36:55 | 显示全部楼层 |阅读模式
函数发布
函数名称: XD::List:Intersection
调用格式: (XD::List:Intersection l1 l2)
参数说明: l1 ---- 表
l2 ---- 表
返回值: 表或nil
函数简介: 返回两个表共有(交集)的元素
函数来源: 原创
函数作者: marting
适用版本: 不限 
最后更新时间: 2019-01-22
备注: -
演示图片: -

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

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

×
  1. (defun XD::List:Intersection ( l1 l2)
  2.   (vl-remove-if-not '(lambda ( x ) (member x l2)) l1)
  3. )


命令: (setq a '(1 2 3))
(1 2 3)

命令: (setq b '(2 4 3 5))
(2 4 3 5)

命令: (XD::List:Intersection a b)
(2 3)


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

已领礼包: 202个

财富等级: 日进斗金

发表于 2020-5-14 11:28:37 | 显示全部楼层
(defun XD::List:Intersection1 ( l1 l2)
  (vl-remove-if-not '(lambda ( x ) (vl-position x l2)) l1)
)
测试两个函数的效率,即测试vl-position 与member的效率
两个表较小,重复元素少时,效率差不多
(defun c:tt(/ lst1 lst)
        (setq lst '(1 2 3)
                lst1 '(2 3 4 5)
        );;;setq
        (repeat 5
                  (xd::quickbench '((XD::List:Intersection lst lst1)(XD::List:Intersection1 lst lst1)))
        )
          (princ)
)

CPU:(1x)Intel(R) Core(TM) i7-7700 @ 3.60GHz 4Cores  / Memory:24G / OS:WIN10专业版
Benchmarking ....... done for 16384 iterations. Sorted from fastest.
Statement                    Increment  Time(ms)  Normalize  Relative
-------------------------------------------------------------------------------
(XD::LIST:INTERSECTION1 L...)    16384      1687       1687      1.05 <fastest>
(XD::LIST:INTERSECTION LS...)    16384      1766       1766      1.00 <slowest>
-------------------------------------------------------------------------------
CPU:(1x)Intel(R) Core(TM) i7-7700 @ 3.60GHz 4Cores  / Memory:24G / OS:WIN10专业版
Benchmarking ....... done for 16384 iterations. Sorted from fastest.
Statement                    Increment  Time(ms)  Normalize  Relative
-------------------------------------------------------------------------------
(XD::LIST:INTERSECTION1 L...)    16384      1578       1578      1.14 <fastest>
(XD::LIST:INTERSECTION LS...)    16384      1797       1797      1.00 <slowest>
-------------------------------------------------------------------------------
CPU:(1x)Intel(R) Core(TM) i7-7700 @ 3.60GHz 4Cores  / Memory:24G / OS:WIN10专业版
Benchmarking ....... done for 16384 iterations. Sorted from fastest.
Statement                    Increment  Time(ms)  Normalize  Relative
-------------------------------------------------------------------------------
(XD::LIST:INTERSECTION1 L...)    16384      1578       1578      1.01 <fastest>
(XD::LIST:INTERSECTION LS...)    16384      1593       1593      1.00 <slowest>
-------------------------------------------------------------------------------
CPU:(1x)Intel(R) Core(TM) i7-7700 @ 3.60GHz 4Cores  / Memory:24G / OS:WIN10专业版
Benchmarking ....... done for 16384 iterations. Sorted from fastest.
Statement                    Increment  Time(ms)  Normalize  Relative
-------------------------------------------------------------------------------
(XD::LIST:INTERSECTION1 L...)    16384      1625       1625      1.04 <fastest>
(XD::LIST:INTERSECTION LS...)    16384      1688       1688      1.00 <slowest>
-------------------------------------------------------------------------------
CPU:(1x)Intel(R) Core(TM) i7-7700 @ 3.60GHz 4Cores  / Memory:24G / OS:WIN10专业版
Benchmarking ....... done for 16384 iterations. Sorted from fastest.
Statement                    Increment  Time(ms)  Normalize  Relative
-------------------------------------------------------------------------------
(XD::LIST:INTERSECTION LS...)    16384      1672       1672      1.01 <fastest>
(XD::LIST:INTERSECTION1 L...)    16384      1688       1688      1.00 <slowest>
-------------------------------------------------------------------------------
两个较大,重复元素较多时,效率就差得有点多了
(defun c:tt(/ i j lst1 lst)
        (setq i 1
                j 100
        );;;setq
        (repeat 30000
                (setq lst (cons i lst)
                        i (1+ i)
                )
                (setq lst1 (cons j lst)
                        j (1+ j)
                )
        )
        (repeat 5
                  (xd::quickbench '((XD::List:Intersection lst lst1)(XD::List:Intersection1 lst lst1)))
        )
          (princ)
)

CPU:(1x)Intel(R) Core(TM) i7-7700 @ 3.60GHz 4Cores  / Memory:24G / OS:WIN10专业版
Benchmarking ....... done for 1 iterations. Sorted from fastest.
Statement                    Increment  Time(ms)  Normalize  Relative
-------------------------------------------------------------------------------
(XD::LIST:INTERSECTION1 L...)        1      1875       1875     12.66 <fastest>
(XD::LIST:INTERSECTION LS...)        1     23734      23734      1.00 <slowest>
-------------------------------------------------------------------------------
CPU:(1x)Intel(R) Core(TM) i7-7700 @ 3.60GHz 4Cores  / Memory:24G / OS:WIN10专业版
Benchmarking ....... done for 1 iterations. Sorted from fastest.
Statement                    Increment  Time(ms)  Normalize  Relative
-------------------------------------------------------------------------------
(XD::LIST:INTERSECTION1 L...)        1      1875       1875     15.46 <fastest>
(XD::LIST:INTERSECTION LS...)        1     28984      28984      1.00 <slowest>
-------------------------------------------------------------------------------
CPU:(1x)Intel(R) Core(TM) i7-7700 @ 3.60GHz 4Cores  / Memory:24G / OS:WIN10专业版
Benchmarking ....... done for 1 iterations. Sorted from fastest.
Statement                    Increment  Time(ms)  Normalize  Relative
-------------------------------------------------------------------------------
(XD::LIST:INTERSECTION1 L...)        1      1844       1844     20.24 <fastest>
(XD::LIST:INTERSECTION LS...)        1     37328      37328      1.00 <slowest>
-------------------------------------------------------------------------------
CPU:(1x)Intel(R) Core(TM) i7-7700 @ 3.60GHz 4Cores  / Memory:24G / OS:WIN10专业版
Benchmarking ....... done for 1 iterations. Sorted from fastest.
Statement                    Increment  Time(ms)  Normalize  Relative
-------------------------------------------------------------------------------
(XD::LIST:INTERSECTION1 L...)        1      1875       1875     19.89 <fastest>
(XD::LIST:INTERSECTION LS...)        1     37297      37297      1.00 <slowest>
-------------------------------------------------------------------------------
CPU:(1x)Intel(R) Core(TM) i7-7700 @ 3.60GHz 4Cores  / Memory:24G / OS:WIN10专业版
Benchmarking ....... done for 1 iterations. Sorted from fastest.
Statement                    Increment  Time(ms)  Normalize  Relative
-------------------------------------------------------------------------------
(XD::LIST:INTERSECTION1 L...)        1      1890       1890     19.87 <fastest>
(XD::LIST:INTERSECTION LS...)        1     37547      37547      1.00 <slowest>
-------------------------------------------------------------------------------


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

使用道具 举报

已领礼包: 202个

财富等级: 日进斗金

发表于 2020-5-14 11:30:27 | 显示全部楼层
结论:vl-position的效率比member的效率高。

点评

你试试带容差的, 怎么写效率更高些  详情 回复 发表于 2020-5-14 13:40
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2020-5-14 13:40:46 | 显示全部楼层
本帖最后由 newer 于 2020-5-14 13:44 编辑
dyjwyqz5221 发表于 2020-5-14 11:30
结论:vl-position的效率比member的效率高。

你试试带容差的, 怎么写效率更高些

  1. (defun XD::List:Intersection-fuzz (l1 l2 fuzz)
  2.   (vl-remove-if-not
  3.     '(lambda (x)
  4.        (setq aa (xd::list:member-if '(lambda(y)(equal x y fuzz)) l2))
  5.      )
  6.     l1
  7.   )
  8. )



  1. ;|
  2. 函数名称:        xd::list:member-if
  3. 调用格式:        (xd::list:member-if f list)
  4. 参数说明:        f ---- 原子 或 函数
  5. l ---- 表
  6. 返回值:        表
  7. 函数简介:        支持函数的member
  8. 函数来源:        原创
  9. 函数作者:        marting
  10. 适用版本:        不限
  11. 最后更新时间:        2018-12-09
  12. 备注:        如果参数是原子,如整数、实数,字符串等,同member
  13. 命令: !a
  14. (1 2 4.1 5 2 3)
  15. 命令: (xd::list:member-if \'(lambda(x)(equal x 4 1e-3)) a)
  16. (4.1 5 2 3)
  17. |;

  18. (defun xd::list:member-if (f l / ff r i $zz)
  19.   (if (= (atom f) (setq r (member f l)))
  20.     (progn (setq i -1)
  21.            (setq ff '(lambda ($zz)
  22.                        (setq i (1+ i))
  23.                        (if (apply f (list $zz))
  24.                          (setq r $zz)
  25.                        )
  26.                      )
  27.            )
  28.            (if (vl-some ff l)
  29.              (setq r (xd::list:n+ l i))
  30.            )
  31.     )
  32.   )
  33.   r
  34. )



  1. ;|
  2. 函数名称:        xd::list:car-member-if
  3. 调用格式:        (xd::list:car-member-if f l)
  4. 参数说明:        f ----- 原子 或 函数
  5. l ----- 表
  6. 返回值:        原子
  7. 函数简介:        支持函数的取member第一个元素
  8. 函数来源:        原创
  9. 函数作者:        marting
  10. 适用版本:        不限
  11. 最后更新时间:        2018-12-09
  12. 备注:        命令: !a
  13. (1 2 3 4.021 5 6 7)
  14. 命令: (xd::list:member-if '(lambda(x)(equal x 4 1e-1)) a)
  15. (4.021 5 6 7)
  16. 命令: (xd::list:car-member-if '(lambda(x)(equal x 4 1e-1)) a)
  17. 4.021
  18. |;

  19. (defun xd::list:car-member-if (f l / ff r)
  20.   (if (= (atom f) (setq r (car (member f l))))
  21.     (progn (setq ff '(lambda ($zz)
  22.                        (if (apply f (list $zz))
  23.                          (setq r $zz)
  24.                        )
  25.                      )
  26.            )
  27.            (vl-some ff l)
  28.     )
  29.   )
  30.   r
  31. )



  1. (defun xd::list:position-fuzz (e l fuzz)
  2.   (if (atom e)
  3.     (vl-position e l)
  4.     (vl-position
  5.       (xd::list:car-member-if '(lambda (x) (equal e x fuzz)) l)
  6.       l
  7.     )
  8.   )
  9. )
  10. ;|
  11. 函数名称:        xd::list:assoc-fuzz
  12. 调用格式:        (xd::list:assoc-fuzz e l fuzz)
  13. 参数说明:        e ----- 查找项
  14. l ----- 关联表
  15. fuzz --- 容差(实数)
  16. 返回值:        表 或 nil
  17. 函数简介:        支持带容差的assoc
  18. 函数来源:        原创
  19. 函数作者:       
  20. 适用版本:        不限
  21. 最后更新时间:        2018-12-09
  22. 备注:        命令: !a
  23. ((1.02 1 2) (2 3 4) (4.023 3 4) (5 6 4))
  24. 命令: (xd::list:assoc-fuzz 4 a 1e-1)
  25. (4.023 3 4)
  26. |;
  27. (defun xd::list:assoc-fuzz (e l fuzz)
  28.   (xd::list:car-member-if '(lambda (x) (equal e (car x) fuzz)) l)
  29. )


点评

做了个带容差的与你那个函数进行了效率对比,如下: (defun _test1(lst1 lst2 fuzz) (vl-remove-if-not '(lambda(x) (xd::list:member-fuzz x lst2 fuzz) ) lst1 ) );;;defun (defun xd::l  详情 回复 发表于 2020-5-15 15:53
我试试写一下,再测试下  详情 回复 发表于 2020-5-15 14:18
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 202个

财富等级: 日进斗金

发表于 2020-5-15 14:18:48 | 显示全部楼层
newer 发表于 2020-5-14 13:40
你试试带容差的, 怎么写效率更高些

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

使用道具 举报

已领礼包: 202个

财富等级: 日进斗金

发表于 2020-5-15 15:53:34 | 显示全部楼层
newer 发表于 2020-5-14 13:40
你试试带容差的, 怎么写效率更高些

做了个带容差的与你那个函数进行了效率对比,如下:
(defun _test1(lst1 lst2 fuzz)
          (vl-remove-if-not
                '(lambda(x)
                        (xd::list:member-fuzz x lst2 fuzz)
                )
                lst1
        )
);;;defun
(defun xd::list:member-fuzz(e lst fuzz)
        (while (and lst (not (equal (car lst) e fuzz)))
                (setq lst (cdr lst))
        );;;while
        (car lst)
);;;defun


你那个函数:
(defun _test2(l1 l2 fuzz)
  (vl-remove-if-not
    '(lambda(x)
       (setq aa (xd::list:member-if '(lambda(y)(equal x y fuzz)) l2))
     )
    l1
  )
);;;defun

(defun xd::list:member-if (f l / ff r i $zz)
  (if (= (atom f) (setq r (member f l)))
    (progn (setq i -1)
           (setq ff '(lambda ($zz)
                       (setq i (1+ i))
                       (if (apply f (list $zz))
                         (setq r $zz)
                       )
                     )
           )
           (if (vl-some ff l)
             (setq r (xd::list:n+ l i))
           )
    )
  )
  r
)

;;;第一次测试,表较小
(defun c:tt(/ lst1 lst)
        (setq lst '(1 2 3)
                lst1 '(2.01 3.01 4.01 5.01)
        );;;setq
        (repeat 5
                  (xd::quickbench '((_test1 lst lst1 1e-2)(_test2 lst lst1 1e-2)))
        )
          (princ)
);;;defun


CPU:(1x)Intel(R) Core(TM) i7-7700 @ 3.60GHz 4Cores  / Memory:24G / OS:WIN10专业版
Benchmarking ....... done for 16384 iterations. Sorted from fastest.
Statement                    Increment  Time(ms)  Normalize  Relative
-------------------------------------------------------------------------------
(_TEST1 LST LST1 0.01)           16384      1781       1781      7.30 <fastest>
(_TEST2 LST LST1 0.01)            2048      1625      13000      1.00 <slowest>
-------------------------------------------------------------------------------
CPU:(1x)Intel(R) Core(TM) i7-7700 @ 3.60GHz 4Cores  / Memory:24G / OS:WIN10专业版
Benchmarking ....... done for 16384 iterations. Sorted from fastest.
Statement                    Increment  Time(ms)  Normalize  Relative
-------------------------------------------------------------------------------
(_TEST1 LST LST1 0.01)           16384      1656       1656      7.25 <fastest>
(_TEST2 LST LST1 0.01)            2048      1500      12000      1.00 <slowest>
-------------------------------------------------------------------------------
CPU:(1x)Intel(R) Core(TM) i7-7700 @ 3.60GHz 4Cores  / Memory:24G / OS:WIN10专业版
Benchmarking ....... done for 16384 iterations. Sorted from fastest.
Statement                    Increment  Time(ms)  Normalize  Relative
-------------------------------------------------------------------------------
(_TEST1 LST LST1 0.01)           16384      1625       1625      7.46 <fastest>
(_TEST2 LST LST1 0.01)            2048      1516      12128      1.00 <slowest>
-------------------------------------------------------------------------------
CPU:(1x)Intel(R) Core(TM) i7-7700 @ 3.60GHz 4Cores  / Memory:24G / OS:WIN10专业版
Benchmarking ....... done for 16384 iterations. Sorted from fastest.
Statement                    Increment  Time(ms)  Normalize  Relative
-------------------------------------------------------------------------------
(_TEST1 LST LST1 0.01)           16384      1656       1656      7.32 <fastest>
(_TEST2 LST LST1 0.01)            2048      1516      12128      1.00 <slowest>
-------------------------------------------------------------------------------
CPU:(1x)Intel(R) Core(TM) i7-7700 @ 3.60GHz 4Cores  / Memory:24G / OS:WIN10专业版
Benchmarking ....... done for 16384 iterations. Sorted from fastest.
Statement                    Increment  Time(ms)  Normalize  Relative
-------------------------------------------------------------------------------
(_TEST1 LST LST1 0.01)           16384      1641       1641      7.31 <fastest>
(_TEST2 LST LST1 0.01)            2048      1500      12000      1.00 <slowest>
-------------------------------------------------------------------------------




;;;第二次测试,表较大

(defun c:tt(/ i j lst1 lst)
        (setq i 1
                j 100.01
        );;;setq
        (repeat 1000
                (setq lst (cons i lst)
                        i (1+ i)
                )
                (setq lst1 (cons j lst1)
                        j (1+ j)
                )
        )
        (repeat 5
                  (xd::quickbench '((_test1 lst lst1 1e-2)(_test2 lst lst1 1e-2)))
        )
          (princ)
);;;defun


CPU:(1x)Intel(R) Core(TM) i7-7700 @ 3.60GHz 4Cores  / Memory:24G / OS:WIN10专业版
Benchmarking ....... done for 4 iterations. Sorted from fastest.
Statement                    Increment  Time(ms)  Normalize  Relative
-------------------------------------------------------------------------------
(_TEST1 LST LST1 0.01)               4      1000       1000     63.31 <fastest>
(_TEST2 LST LST1 0.01)               1     15828      63312      1.00 <slowest>
-------------------------------------------------------------------------------
CPU:(1x)Intel(R) Core(TM) i7-7700 @ 3.60GHz 4Cores  / Memory:24G / OS:WIN10专业版
Benchmarking ....... done for 4 iterations. Sorted from fastest.
Statement                    Increment  Time(ms)  Normalize  Relative
-------------------------------------------------------------------------------
(_TEST1 LST LST1 0.01)               4      1000       1000     62.75 <fastest>
(_TEST2 LST LST1 0.01)               1     15688      62752      1.00 <slowest>
-------------------------------------------------------------------------------
CPU:(1x)Intel(R) Core(TM) i7-7700 @ 3.60GHz 4Cores  / Memory:24G / OS:WIN10专业版
Benchmarking ....... done for 8 iterations. Sorted from fastest.
Statement                    Increment  Time(ms)  Normalize  Relative
-------------------------------------------------------------------------------
(_TEST1 LST LST1 0.01)               8      2125       2125     61.06 <fastest>
(_TEST2 LST LST1 0.01)               1     16218     129744      1.00 <slowest>
-------------------------------------------------------------------------------
CPU:(1x)Intel(R) Core(TM) i7-7700 @ 3.60GHz 4Cores  / Memory:24G / OS:WIN10专业版
Benchmarking ....... done for 8 iterations. Sorted from fastest.
Statement                    Increment  Time(ms)  Normalize  Relative
-------------------------------------------------------------------------------
(_TEST1 LST LST1 0.01)               8      2125       2125     64.53 <fastest>
(_TEST2 LST LST1 0.01)               1     17141     137128      1.00 <slowest>
-------------------------------------------------------------------------------
CPU:(1x)Intel(R) Core(TM) i7-7700 @ 3.60GHz 4Cores  / Memory:24G / OS:WIN10专业版
Benchmarking ....... done for 4 iterations. Sorted from fastest.
Statement                    Increment  Time(ms)  Normalize  Relative
-------------------------------------------------------------------------------
(_TEST1 LST LST1 0.01)               4      1000       1000     67.50 <fastest>
(_TEST2 LST LST1 0.01)               1     16875      67500      1.00 <slowest>
-------------------------------------------------------------------------------


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-25 15:19 , Processed in 0.429403 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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