如何从 lisp 的嵌套列表中删除长度为 1 的列表?
How to remove a list of length 1 from a nested list in lisp?
我有一个嵌套列表 (1 (4 (5) 3) 9 10),我想删除长度为 1 的列表,因此结果将是 (1 (4 3) 9 10)。
这是我到目前为止尝试过的方法,它不会删除 (5) 和 returns 原始列表。
(defun remove (l)
(cond
((null l) nil)
((and (listp (car l)) (= (length l) 1)) (remove (cdr l)))
((atom (car l)) (cons (car l) (remove (cdr l))))
(T (cons (remove (car l)) (remove (cdr l))))
))
两件事:首先,remove
是包 CL 中的预定义函数,因此我强烈建议使用不同的名称,比如 my-remove
。
其次,您正在测试 l
而不是子列表 (car l)
的长度,这是您要消除的内容。
正确的形式是:
(defun my-remove (l)
(cond
((null l) nil)
((and (listp (car l)) (= (length (car l)) 1)) (my-remove (cdr l)))
((atom (car l)) (cons (car l) (my-remove (cdr l))))
(T (cons (my-remove (car l)) (my-remove (cdr l))))
))
尾调用递归版本。另外:没有测试 (atom (car l))
允许列表中的非列表和非原子组件。 (例如,向量或其他对象作为列表的元素 - 它们被视为原子。
(defun my-remove (l &optional (acc '()))
(cond ((null l) (nreverse acc))
((listp (car l)) (if (= 1 (length (car l))) ;; list objects
(my-remove (cdr l) acc) ;; - of length 1
(my-remove (cdr l) (cons (my-remove (car l)) acc)))) ;; - longer
(t (my-remove (cdr l) (cons (car l) acc))))) ;; non-list objects
我有一个嵌套列表 (1 (4 (5) 3) 9 10),我想删除长度为 1 的列表,因此结果将是 (1 (4 3) 9 10)。 这是我到目前为止尝试过的方法,它不会删除 (5) 和 returns 原始列表。
(defun remove (l)
(cond
((null l) nil)
((and (listp (car l)) (= (length l) 1)) (remove (cdr l)))
((atom (car l)) (cons (car l) (remove (cdr l))))
(T (cons (remove (car l)) (remove (cdr l))))
))
两件事:首先,remove
是包 CL 中的预定义函数,因此我强烈建议使用不同的名称,比如 my-remove
。
其次,您正在测试 l
而不是子列表 (car l)
的长度,这是您要消除的内容。
正确的形式是:
(defun my-remove (l)
(cond
((null l) nil)
((and (listp (car l)) (= (length (car l)) 1)) (my-remove (cdr l)))
((atom (car l)) (cons (car l) (my-remove (cdr l))))
(T (cons (my-remove (car l)) (my-remove (cdr l))))
))
尾调用递归版本。另外:没有测试 (atom (car l))
允许列表中的非列表和非原子组件。 (例如,向量或其他对象作为列表的元素 - 它们被视为原子。
(defun my-remove (l &optional (acc '()))
(cond ((null l) (nreverse acc))
((listp (car l)) (if (= 1 (length (car l))) ;; list objects
(my-remove (cdr l) acc) ;; - of length 1
(my-remove (cdr l) (cons (my-remove (car l)) acc)))) ;; - longer
(t (my-remove (cdr l) (cons (car l) acc))))) ;; non-list objects