aloy 发表于 2022-7-5 23:13:36

从lis中删除子列表

大家好,
我有一个包含子列表的列表。我想消除测试函数中的子列表。如何消除开括号和封闭括号以及我得到的“nil”形式的结果。
列表:
我得到的结果是:
(((4.0 6.0)(8.0 9.0)(12.0 15.0)))无)
提前感谢
芦荟

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

您是否希望删除任何包含冗余项的子列表?
(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将用评估结果替换列表项。

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

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)
)
)

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

确切地这两个函数在给定的列表上都可以很好地工作;稍后我将在一个更长的列表上进行测试,可能多达500个。
谢谢Mircea

MSasu 发表于 2022-7-5 23:50:06

不客气,艾莉!

Lee Mac 发表于 2022-7-5 23:58:10

任意长度子列表的另一种递归方法:
 
(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)))

Lee Mac 发表于 2022-7-5 23:59:43

和另一个迭代版本:
(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)))

aloy 发表于 2022-7-6 00:13:09

尊敬的李:,
两者都很好。感谢我不知道如何有效使用的技巧。
当做
芦荟

Lee Mac 发表于 2022-7-6 00:18:45

不客气,阿洛伊
页: [1]
查看完整版本: 从lis中删除子列表