首页 > 解决方案 > 如何从列表中的子列表中删除括号?

问题描述

(defun ppl (list)
  (loop for x in list
    collect (cons x '(ppl))))
(ppl '(1 2 3))
=> ((1 ppl) (2 ppl) (3 ppl))

虽然还在里面ppl,我如何删除括号以使结果变为

=> (1 ppl 2 ppl 3 ppl)

我了解我的代码从根本上创建了一个子列表列表。可以使用一些帮助来扁平化列表。也许如果我能以某种方式获得收集退货的清单?

标签: listcommon-lispflatten

解决方案


使用nconc代替collect

(defun ppl (list)
  (loop for x in list
    nconc (list x 'ppl)))
(ppl '(1 2 3))
==> (1 PPL 2 PPL 3 PPL)

请注意,我替换(cons x '(ppl))(list x 'ppl))以避免可能重用(ppl)可能nconc变成循环列表的文字。如果您坚持在代码中引用文字(坏主意!),请使用append而不是nconc.


推荐阅读