从lis中删除子列表
大家好,我有一个包含子列表的列表。我想消除测试函数中的子列表。如何消除开括号和封闭括号以及我得到的“nil”形式的结果。
列表:
我得到的结果是:
(((4.0 6.0)(8.0 9.0)(12.0 15.0)))无)
提前感谢
芦荟 您是否希望删除任何包含冗余项的子列表?
(defun Eliminate( triangList )
(foreach subList triangList
(if (or (equal (carsubList) (cadrsubList) 0.1)
(equal (carsubList) (caddr subList) 0.1)
(equal (cadr subList) (caddr subList) 0.1))
(setq triangList (vl-remove subList triangList))
)
)
triangList
)
请注意,MAPCAR将用评估结果替换列表项。 MAPCAR方法:
(defun Eliminate( triangList / )
(vl-remove nil (mapcar '(lambda (a)
(if (or (equal (cara) (cadra) 0.1)
(equal (cara) (caddr a) 0.1)
(equal (cadr a) (caddr a) 0.1))
nil
a
)
)
triangList)
)
) 确切地这两个函数在给定的列表上都可以很好地工作;稍后我将在一个更长的列表上进行测试,可能多达500个。
谢谢Mircea 不客气,艾莉! 任意长度子列表的另一种递归方法:
(defun foo ( l )
(cond
( (null l) nil)
( (bar (car l)) (foo (cdr l)))
( (cons (car l) (foo (cdr l))))
)
)
(defun bar ( x )
(cond
( (null x) nil)
( (vl-some '(lambda ( y ) (equal (car x) y 0.1)) (cdr x)))
( (bar (cdr x)))
)
)
_$ (foo '(((3.0 2.0) (3.0 2.0) (4.0 5.0)) ((4.0 6.0) (8.0 9.0) (12.0 15.0))))
(((4.0 6.0) (8.0 9.0) (12.0 15.0))) 和另一个迭代版本:
(defun foo ( l )
(vl-remove-if
'(lambda ( x )
(while (and (cdr x) (not (vl-some '(lambda ( y ) (equal (car x) y 0.1)) (cdr x))))
(setq x (cdr x))
)
(cdr x)
)
l
)
)
_$ (foo '(((3.0 2.0) (4.0 5.0) (8.0 9.0) (3.0 2.0)) ((4.0 6.0) (8.0 9.0) (12.0 15.0))))
(((4.0 6.0) (8.0 9.0) (12.0 15.0))) 尊敬的李:,
两者都很好。感谢我不知道如何有效使用的技巧。
当做
芦荟 不客气,阿洛伊
页:
[1]