list - 在 lisp 中展平列表

标签 list lisp flatten

所以我一直在考虑在 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/

相关文章:

list - F# If 语句 List.exists

java - 如何以一种好的方式在 Java 中的同一个列表中查找对象对

Lisp 追加无法正常工作

python - 从 csv 文件 python 解析字典

r - 将 `unnest_wider()` 递归应用于所有列,直到不再有嵌套的列表列?

python - 在列表中查找具有相同第一项的元组并返回另一个列表

python - 为什么 `int in List[List[int]]` 返回 `False` 但 `np.int in List[List[int]]` 返回 `True` ?

list - 从 Scheme 中的列表中删除元素

scheme - 在 Scheme 中检查对象是否为 "listdiff"

r - 在 R 中展平嵌套 JSON