Common Lisp如何从嵌套列表中拆分字符串并提取指定元素生成新列表
正确实现代码
你现有的字符串拆分逻辑是正常可用的,针对嵌套列表场景的提取逻辑可以按如下方式编写:
;; 替换 *your-nested-list* 为你实际的原始嵌套列表变量名 (defparameter *list1* (loop for sublist in *your-nested-list* ;; 取子列表中索引为3的目标字符串,和你原有逻辑对应 for target-str = (nth 3 sublist) ;; 拆分字符串得到分段列表 for split-result = (my-split target-str :delimiterp #'delimiterp) ;; 提取第三个分段(索引从0计数,第三个对应索引2)中的数字,自动忽略后缀非数字字符 for target-num = (parse-integer (nth 2 split-result) :junk-allowed t) ;; 收集每轮的数字生成最终列表 collect target-num))
如果是示例中的单层字符串列表,验证代码如下:
(defparameter *demo-input* '("4-No 16dia" "6-No 20dia")) (defparameter *demo-output* (loop for str in *demo-input* for parts = (my-split str :delimiterp #'delimiterp) collect (parse-integer (nth 2 parts) :junk-allowed t))) ;; 执行后 *demo-output* 的值为 (16 20),符合需求
原有代码的问题说明
loop语法错误,缺少collect关键字来收集每轮运算的结果,不需要用append拼接,直接收集单个数值即可- 索引计数错误:Common Lisp中序列索引从0开始计数,
my-split返回的分段列表的第三个元素对应nth 2而非nth 0 - 新增
parse-integer的:junk-allowed t参数,可自动过滤16dia这类字符串后缀的非数字内容,直接提取前缀数字
内容的提问来源于stack exchange,提问作者Gayathri
相关产品推荐
相关产品推荐

