仍在研究口齿不清的食谱和习语。
我有一个这样的清单:
((a b c) (d e f) nil (g h))
我想将其合并到一个列表中,
(a b c d e f g h)
似乎有一个单行班。
答案 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。
答案 2 :(得分:0)
您还可以使用reduce
和append
:
(reduce #'append '((a b c) (d e f) nil (g h)))
不幸的是,与其他解决方案相比,它的时间和空间效率要低得多,因为它会大量调用append
并不必要地复制正在进行的结果。
答案 3 :(得分:0)
在涉及reduce
和append
的答案中,您还可以将: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)