所以我一直在考虑在 lisp 中展平列表。
但是,我想做的是逐层展开列表。
所以不用
(flatten '(a (b (d (g f))) e)) = (a b d g f e)
我要
(flatten '(a (b (d (g f))) e)) = (a b (d (g f )) e )
伙计们,知道怎么做吗?
非常感谢 =)
最佳答案
你可以这样做,例如:
(defun fletten-level (tree)
(loop for e in tree
nconc
(if (consp e)
(copy-list e)
(list e))))
(fletten-level '(a (b (d (g f))) e))
;; (A B (D (G F)) E)
这会遍历原始树的顶级分支并创建一个新列表,如果该分支是一片叶子,则包含该叶子,如果该分支有两个其他分支,则包含第一个叶子和其余分支。
编辑:抱歉,实际上第一次不好,现在应该修复了。
EDIT2:只是因为我自己都快糊涂了。 (cons (car e) (cdr e))
看起来有点奇怪,因为它基本上等同于只说 e
。然而,我意识到 nconc
会破坏性地修改 cons,所以它必须是这样的(即创建一个新的 cons 单元来连接而不是重用旧的)。
EDIT3:哇...实际上,它必须是copy-list
,因为它会以这种方式修改原始列表。
关于list - 在 lisp 中展平列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13171928/