You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Lisp的dolist构造移除列表指定字母的函数问题咨询

解决Lisp移除列表中指定字母的问题

我来帮你排查下代码里的问题,然后给出几种可行的实现方案~

原代码的问题分析

你当前的代码有两个关键问题:

  1. 当匹配到目标字母时,你用(cons nil new-list)把nil添加到了新列表里,但我们需要的是跳过这个元素,而不是插入空值;
  2. cons操作是把元素添加到列表的头部,所以最后得到的new-list是原列表的反转顺序,再加上多余的nil,自然和预期结果不符。

修正后的实现方案

方案1:修正你的dolist写法(命令式风格)

我们可以只收集不匹配的元素,最后用nreverse把顺序转正:

(defun extract-all (lett li)
  (let ((new-list nil))
    (dolist (letter li)
      (unless (eql lett letter)
        (push letter new-list)))
    (nreverse new-list)))

测试调用:

(extract-all 'n '(i n t e l l)) ; 返回 (i t e l l)

方案2:递归实现(函数式风格)

这更符合Lisp的传统写法,通过递归遍历列表,跳过目标元素:

(defun extract-all (lett li)
  (cond
    ((null li) nil)
    ((eql lett (car li))
     (extract-all lett (cdr li)))
    (t
     (cons (car li) (extract-all lett (cdr li))))))

方案3:直接用内置函数(最简洁)

其实Lisp已经内置了remove函数,完全满足你的需求——它会移除列表中所有匹配的元素:

(defun extract-all (lett li)
  (remove lett li))

如果只需要移除第一个匹配的元素,可以加上:count 1参数:(remove lett li :count 1)。

内容的提问来源于stack exchange,提问作者KB_Shayan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:19:34