gsc 发表于 2022-7-5 16:00:53

列出问题

我有2个等长的列表,其中包含以下项:((x y z)name)
 
示例列表1:
((496502.36 5733207.41 0.0)S4\U WTG-H01)((495332.36 5734422.41 0.0)S4\U WTG-H02)((493742.36 5734362.41 0.0)S4\U WTG-H03)((493427.36 5735207.41 0.0)S4\U WTG-H04)((492132.276311227 5734917.0.0)S4\U WTG-H05))
 
示例列表2:
((496502.36 5733207.41 0.0)S4\u OSS-H01\u CASE2\u AP-ORG)((495332.36 5734422.41 0.0)S4\u H01-H02\u CASE2\u AP-ORG)((493742.36 5734362.41 0.0)S4\u H02-H03\u CASE2\u AP-ORG)((493427.36 5735207.41 0.0)S4\u H03-H04\u CASE2\u AP-ORG)((492300.0 5734917).0 0.0)S4\u H04-H05\u案例2\u AP-ORG)
 
我想基于(x y z)坐标比较这两个列表。
如何获取列表1项((x y z)名称),哪些xyz坐标与列表2的任何xyz坐标都不匹配?
 
笔记:
 
[列表]
[*]两个列表可以随机排序
[*]在所示的示例列表中,1个坐标不匹配用于测试目的
[/列表]
 
我发现了这样的东西:
 
(vl-remove-if '(lambda (x) (member (x) list2)) list1)对于上述代码,列表1应仅以不匹配的((x y z)名称)项结束。
现在x是((x y z)名称),但我需要比较(车x)=(x y z)。
 
但我在某个地方读到,如果坐标(不)相等,则无法与“成员”进行检查?
有人知道怎么做吗?

Lee Mac 发表于 2022-7-5 16:25:11

请尝试以下操作:
(defun foo ( lst1 lst2 )
   (vl-remove-if
       (function
         (lambda ( itm1 )
               (vl-some
                   (function
                     (lambda ( itm2 )
                           (equal (car itm1) (car itm2) 1e-
                     )
                   )
                   lst2
               )
         )
       )
       lst1
   )
)
_$ (foo list1 list2)
(((492132.0 5.73492e+006 0.0) S4_WTG-H05))

gsc 发表于 2022-7-5 16:57:17

哇!很有魅力,塔克斯!

Lee Mac 发表于 2022-7-5 17:05:59

不客气!
页: [1]
查看完整版本: 列出问题