lisp:将列表列表合并到一个列表中?

时间:2010-04-11 18:44:22

标签: lisp list

仍在研究口齿不清的食谱和习语。

我有一个这样的清单:

((a b c) (d e f) nil (g h))

我想将其合并到一个列表中,

(a b c d e f g h)

似乎有一个单行班。

4 个答案:

答案 0 :(得分:9)

(apply #'append '((a b c) (d e f) (g h i)))

(loop for outer in '((a b c) (d e f) (g h i))
      nconcing (loop for inner in outer collecting inner))

答案 1 :(得分:3)

这是一个典型的家庭作业问题。通常,此操作称为FLATTEN(它会使所有级别的列表变平)。

(mapcan #'copy-list '((a b c) (d e f) nil (g h)))

APPLY变体存在的问题是,当有多个子列表而不是CALL-ARGUMENTS-LIMIT时,它可能会遇到CALL-ARGUMENTS-LIMIT。

例如,参见http://rosettacode.org/wiki/Flatten_a_list#Common_Lisp

答案 2 :(得分:0)

您还可以使用reduceappend

(reduce #'append '((a b c) (d e f) nil (g h)))

不幸的是,与其他解决方案相比,它的时间和空间效率要低得多,因为它会大量调用append并不必要地复制正在进行的结果。

答案 3 :(得分:0)

在涉及reduceappend的答案中,您还可以将:from-end的{​​{1}}参数用作reduce,因为它避免了不必要的操作,效率更高复制正在进行的结果,因为append doesn't copy its second argument

(reduce #'append '((a b c) (d e f) nil (g h)) :from-end t)