aloy 发表于 2022-7-5 23:21:03

查找列表的成员

大家好,
我有以下问题:
命令:!d1
(1.0 9.0)
 
命令:!lst1
((2.0 3.0) (9.0 6.0) (17.0 7.0) (22.0 15.0) (20.0 20.0) (14.0 20.0) (8.0 19.0)
(3.7 14.0) (1.0 9.0) (6.0 10.0) (11.0 7.0) (12.0 13.0) (9.0 14.0))
 
命令:(成员d1 lst1)

 
命令:(setq x’(1.0 9.0))
(1.0 9.0)
 
命令:(成员x lst1)
((1.0 9.0) (6.0 10.0) (11.0 7.0) (12.0 13.0) (9.0 14.0))
 
d1由给出两条线交点的例程给出。当我试图找到它是否在列表lst1中时,它返回nil。但点(1.0 9.0)实际上在列表中,成员测试与下一个测试中一样返回none nil。
可以提供一个帮助来获得none nil:
(构件d1 lst1)
 
提前感谢
芦荟

MSasu 发表于 2022-7-5 23:26:57

请检查这些报表返回了什么?
(equal d1 x)
(type d1)

MSasu 发表于 2022-7-5 23:32:35

再次阅读您的帖子,我刚刚注意到您的变量d1来自交点计算-这意味着它的项很可能带有一些小数(不可见):
(rtos (card1) 2 18)
(rtos (cadr d1) 2 18)
 
 
因此,这段代码应该解决这个问题(调整它以匹配您所需的精度):
(member (mapcar '(lambda(x) (distof (rtos x 2 0) 2)) d1) lst1)

Tharwat 发表于 2022-7-5 23:36:34

大概
 

(and (eq (type d1) 'LIST)
    (vl-some '(lambda (u) (and (eq (car u) (car d1)) (eq (cadr u) (cadr d1)))) lst1)
)

MSasu 发表于 2022-7-5 23:40:40

Tharwat可能也想考虑这种情况:
(setq d1 '(1.000000005 9.000000058))

Tharwat 发表于 2022-7-5 23:41:53

 
这与OP的需求完全不同。

MSasu 发表于 2022-7-5 23:45:28

不太确定:
否则,会员电话就足够了。

Tharwat 发表于 2022-7-5 23:51:40

 
让我们拭目以待。

pBe 发表于 2022-7-5 23:54:37

 
 
在这件事上,我支持姆萨苏。。
这就足够了,。[与您发布的内容相比]
(member d1 lst1)
 
至于您的代码,即使您使用“equal”而不是“eq”,结果仍然是预期的结果。现在的结果是“T”
 
甚至
 
(vl-some '(lambda (u) (if (and (equal (car u) (car d1) 0.01)
                          (equal(cadr u) (cadr d1) 0.01)) u)) lst1)
 
将只生成(1.0 9.0),作为单个列表。正如标题所示,查找列表的成员。。。
 
也许这就是OP一直想要的。为了测试目标是否存在于列表中,那么vl一些方法就足够了[但使用相同]
 
(vl-member-if
'(lambda (p)
    (vl-every '(lambda        (p q)
          (equal p q 0.1)
        )
       d1
       p
    )
)
lst1
)

 
((1.0 9.0) (6.0 10.0) (11.0 7.0) (12.0 13.0) (9.0 14.0))
 
HTH公司

aloy 发表于 2022-7-5 23:58:52

Tharwat、MSasu和pBe
当d1和lst1在内存中时,我输入了Tharwat的代码并调用了它。我得到的是零。列表是我得到的类型。
MSasu的代码运行正常,pBe也给出了相同的结果。
你们三个人的帮助使我掌握了以前我不太清楚的错综复杂的事情。谢谢大家
页: [1] 2
查看完整版本: 查找列表的成员