Kowal 发表于 2022-7-5 17:35:32

从中删除元素(列表上)

你好
我编写了一个函数来转换列表。
该函数删除列表2中第一个元素不存在的子列表。
请发表评论。
(defun convert (L b / L a)
(setq a (mapcar 'car L))
(mapcar '(lambda (%) (setq a (mapcar '(lambda (e) (if (= e %) nil e)) a))) b)
(setq a (vl-remove nil a))
(mapcar '(lambda (%) (setq L (mapcar '(lambda (x) (if (= (car x) %) nil x)) L))) a)
(vl-remove nil L)
)
例子:
(convert lst1 lst2)
清单1:
'(("1" 1.7 1.7)
("2" 9.9 9.9)
("3" 9.8 9.
("4" 9.9 9.9)
("5" 1.4 1.4)
("6" 8.8 8.
("7" 1.3 1.3)
("8" 8.7 8.7)
("9" 9.5 9.5))
清单2:
'("1" "3" "9")
结果:
'(("1" 1.7 1.7)
("3" 9.8 9.
("9" 9.5 9.5))

Tharwat 发表于 2022-7-5 17:50:23

试试这个:
 

(defun convert (l1 l2 / l)
(mapcar '(lambda (x) (if (member (car x) l2)(setq l (cons x l)))) l1)
(if l (reverse l) (princ)
)
)

Lee Mac 发表于 2022-7-5 17:53:36

我建议:
示例:
(convert
'("1" "3" "9")
'(
       ("1" 1.7 1.7)
       ("2" 9.9 9.9)
       ("3" 9.8 9.
       ("4" 9.9 9.9)
       ("5" 1.4 1.4)
       ("6" 8.8 8.
       ("7" 1.3 1.3)
       ("8" 8.7 8.7)
       ("9" 9.5 9.5)
   )
)
=> (("1" 1.7 1.7) ("3" 9.8 9. ("9" 9.5 9.5))

Kowal 发表于 2022-7-5 18:01:23

谢谢你。
李Mac看着你的代码和你的思维方式,我知道我还有很多东西要学。

Grrr 发表于 2022-7-5 18:09:57

大家好,
我还有一个类似的问题,它如何能够扭转这种局面?因此,在LM的示例中,将返回与“2”“4”“5”“6”“7”和“8”的关联。

Lee Mac 发表于 2022-7-5 18:26:02

 
非常感谢。我希望我的代码对你的学习有用。
 
 
(defun convert ( k l )
   (vl-remove-if '(lambda ( x ) (member (car x) k)) l)
)

Grrr 发表于 2022-7-5 18:32:55

谢谢李,
科瓦尔并不是唯一一个会从中吸取教训的人。
无论如何,这是一个很好的线程,它启发了我收集一些“assoc list manipulation”子函数,虽然有很多子函数,但它们只适用于普通列表。

marko_ribar 发表于 2022-7-5 18:37:18

当您有第一个解决方案时,可以在第一个解决方案上构建第二个请求:
 
9
页: [1]
查看完整版本: 从中删除元素(列表上)