乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 92|回复: 9

[编程交流] 在列表中排序列表

[复制链接]

8

主题

34

帖子

26

银币

初来乍到

Rank: 1

铜币
40
发表于 2022-7-5 18:40:20 | 显示全部楼层 |阅读模式
我有一个基本上由点列表组成的列表。我需要比较点列表(模糊度可以是2’,但每英寸的分数都会有所不同),并记录所有长度和点位置相等的点:
((1 (1 2 0) (3 4 0) (5 6 0)) (2 (3 4 0) (1 2 0) (5 6 0)) (3 (2 1 0) (4 3 0) (5 6 0)) (4 (1 2 0) (3 4 0) (5 6 0)) (5 (7 8 0) (9 10 0) (5 6 0)) (6 (2 1 0) (4 3 0) (5 6 0))
结果是:((1 2 4)(3 6))
注意2仍然是相等的,即使点无序,5被忽略,因为它是唯一的。哦,我指的这些数字是用于跟踪单个列表的主要索引数字。如果这意味着什么,第一个点总是0,0–或接近它。
以下是该程序生成的实际列表:
 
我相信结果是((1 2 4 5)(6 9 10))。清单3、7、8和11是唯一的。3缺少一点,11完全不同。列表7和8应该匹配,但我的程序刚刚告诉我#7缺少一点。任何事情的顺序都不重要,只要列出的列表定义了哪些列表是相等的。列表通常有6-10个点长,一个图形中可以有多达80个列表,在某些组合中通常有80%以上的列表相互匹配。
 
我到处都找过了,什么都没找到。当我试着用手去做的时候,它立刻分解成了一个个循环,我不可能在脑海中记录下来,去理解我在做什么或试图做什么。你们中的一些人在编程方面非常老练(因为你们是专业人士),我纯粹是业余爱好者。因此,请避免视觉lisp。我不可能理解这一点,也不可能在以后需要时对其进行调整。我相信有人会嘲笑我,然后用几句话来解决这个问题。Mapcar和Lambda的疯狂组合。提前谢谢。对不起,如果我没有正确地发布这个。我经常潜伏,但很少发帖。谢谢
回复

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2022-7-5 18:49:29 | 显示全部楼层
当你说,请避免视觉Lisp程序,你为什么把你的问题张贴在这里?
 
 
您的解决方案在于此链接http://www.lee-mac.com/uniqueduplicate.html
 
 
但是这意味着使用visual lisp
 
 
gr.Rlx
回复

使用道具 举报

0

主题

375

帖子

385

银币

限制会员

铜币
-7
发表于 2022-7-5 18:58:36 | 显示全部楼层
试试这个
 
  1. (defun group (l f / round o r)
  2. (defun round (a f)
  3.    (cond
  4.      ((numberp a)
  5.       (if (equal a (fix a)) a (* (atof (rtos (/ a f) 2 0)) f))
  6.       )
  7.      ((and a (listp a)) (mapcar '(lambda (x) (round x f)) a))
  8.      )
  9.    )
  10. (setq l (mapcar
  11.            (function
  12.              (lambda (x)
  13.                (cons
  14.                  (car x)
  15.                  (vl-sort
  16.                    (vl-sort
  17.                      (vl-sort
  18.                        (cdr x)
  19.                        '(lambda (a b) (< (caddr a) (caddr b)))
  20.                      )
  21.                      '(lambda (a b) (< (cadr a) (cadr b)))
  22.                    )
  23.                    '(lambda (a b) (< (car a) (car b)))
  24.                  )
  25.                )
  26.              )
  27.            )
  28.            (if (/= f 0.0) (round l f) l)
  29.          )
  30.        )
  31. (foreach x (reverse l)
  32.    (if
  33.      (setq o (vl-some '(lambda (a) (if (vl-every 'equal (car a) (cdr x)) a)) r))
  34.      (setq r (subst (list (car o) (cons (car x) (cadr o))) o r))
  35.      (setq r (cons (list (cdr x) (list (car x))) r))
  36.      )
  37.    )
  38. (vl-remove-if '(lambda (a) (< (length a) 2)) (mapcar 'cadr r))
  39. )
  1. _$ (setq l '((1 (-5.68434e-014 1.13687e-013 0.0) (-5.68434e-014 ...
  2. _$ (group l 0)      -> nil
  3. _$ (group l 1)      -> ((1 2 4 5) (6 9 10))
  4. _$ (group l 0.0001) -> ((1 2 4 5) (6 9))
  5. _$ (setq l '((1 (1 2 0) (3 4 0) (5 6 0)) (2 (3 4 ...
  6. _$ (group l 0)      -> ((1 2 4) (3 6))
  7. _$ (group l 1)      -> ((1 2 4) (3 6))
回复

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2022-7-5 19:05:13 | 显示全部楼层
 
 
 
 
哇,令人印象深刻:-)
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 19:09:32 | 显示全部楼层
以下是Stefan方法的优化:
  1. (defun sort2 ( lst fuz / rtn tmp )
  2.    (foreach itm lst
  3.        (setq tmp
  4.            (vl-sort (cdr itm)
  5.               '(lambda ( a b )
  6.                    (if (equal (car a) (car b))
  7.                        (if (equal (cadr a) (cadr b))
  8.                            (< (caddr a) (caddr b))
  9.                            (< (cadr  a) (cadr  b))
  10.                        )
  11.                        (< (car a) (car b))
  12.                    )
  13.                )
  14.            )
  15.        )
  16.        (or (vl-some
  17.               '(lambda ( x )
  18.                    (if (vl-every '(lambda ( a b ) (equal a b fuz)) (last x) tmp)
  19.                        (setq rtn  (subst (cons (car itm) x) x rtn))
  20.                    )
  21.                )
  22.                rtn
  23.            )
  24.            (setq rtn (cons (list (car itm) tmp) rtn))
  25.        )
  26.    )
  27.    (reverse (vl-remove-if-not 'cdr (mapcar '(lambda ( x ) (cdr (reverse x))) rtn)))
  28. )

比较:
  1. _$ (benchmark '((group lst 0.01) (sort2 lst 0.01)))
  2. Benchmarking ............Elapsed milliseconds / relative speed for 512 iteration(s):
  3.    (SORT2 LST 0.01).....1513 / 2.51 <fastest>
  4.    (GROUP LST 0.01).....3791 / 1 <slowest>
回复

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2022-7-5 19:17:10 | 显示全部楼层
 
 
我就知道你无法抗拒李哈哈
回复

使用道具 举报

8

主题

34

帖子

26

银币

初来乍到

Rank: 1

铜币
40
发表于 2022-7-5 19:21:28 | 显示全部楼层
你们太棒了,非常感谢。有时,我不得不进入我十多年前自己编写的程序,我找到了一页长的例程,我可以用自己的lambda和mapcar表达式在几行中完成。都是从你们身上学到的。现在更容易了,更准确了,我的调试时间也更短了。大约一周前,我意识到我需要这个常规,我整个星期都在害怕它。我昨天就开始了。我想在我开始之前我就已经精神崩溃了。非常感谢大家,效果很好。
回复

使用道具 举报

55

主题

402

帖子

357

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
274
发表于 2022-7-5 19:27:29 | 显示全部楼层
 
这是李给你的。。。始终尝试给出适当的解决方案。。。。向你致敬
回复

使用道具 举报

0

主题

375

帖子

385

银币

限制会员

铜币
-7
发表于 2022-7-5 19:34:01 | 显示全部楼层
 
  1. 5
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 19:42:39 | 显示全部楼层
 
这取决于模糊是应解释为点之间距离的公差,还是单个坐标值相等的公差。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-12 13:44 , Processed in 0.367987 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表