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

Racket中子列表合并问题:程序返回异常嵌套列表求助

解决Racket子列表合并需求

嘿,看起来你已经成功生成了所有前缀('a/'b)和颜色形状的组合项,现在需要把相同前缀的子列表合并到一起对吧?我来帮你实现这个目标。

首先,先确认一下你当前的输出:

(list (list 'a (list 'red 'circle)) 
      (list 'a (list 'red 'square)) 
      (list 'a (list 'green 'circle)) 
      (list 'a (list 'green 'square)) 
      (list 'a (list 'blue 'circle)) 
      (list 'a (list 'blue 'square)) 
      (list 'b (list 'red 'circle)) 
      (list 'b (list 'red 'square)) 
      (list 'b (list 'green 'circle)) 
      (list 'b (list 'green 'square)) 
      (list 'b (list 'blue 'circle)) 
      (list 'b (list 'blue 'square)))

我们的目标是把它转换成相同前缀的子项合并到同一列表下的结构,比如:

(list (list 'a 
            (list (list 'red 'circle) 
                  (list 'red 'square) 
                  (list 'green 'circle) 
                  (list 'green 'square) 
                  (list 'blue 'circle) 
                  (list 'blue 'square)))
      (list 'b 
            (list (list 'red 'circle) 
                  (list 'red 'square) 
                  (list 'green 'circle) 
                  (list 'green 'square) 
                  (list 'blue 'circle) 
                  (list 'blue 'square))))

实现方案:用group-by分组后合并

Racket内置了group-by函数,正好可以帮我们按前缀分组,之后再对每个分组进行整理即可。直接上代码:

; 先定义你的原始输出列表
(define original-output
  (list (list 'a (list 'red 'circle)) 
        (list 'a (list 'red 'square)) 
        (list 'a (list 'green 'circle)) 
        (list 'a (list 'green 'square)) 
        (list 'a (list 'blue 'circle)) 
        (list 'a (list 'blue 'square)) 
        (list 'b (list 'red 'circle)) 
        (list 'b (list 'red 'square)) 
        (list 'b (list 'green 'circle)) 
        (list 'b (list 'green 'square)) 
        (list 'b (list 'blue 'circle)) 
        (list 'b (list 'blue 'square))))

; 合并子列表的核心逻辑
(define merged-result
  (map (lambda (group)
         ; 每个分组的第一个元素的car就是前缀('a或'b)
         (list (car (first group))
               ; 收集分组里所有子列表的第二个元素(颜色形状组合)
               (map cadr group)))
       ; 按每个子列表的第一个元素(前缀)分组
       (group-by car original-output)))

; 运行查看结果
merged-result

代码说明

  • (group-by car original-output):把原始列表中的每个子列表按其第一个元素('a或'b)分组,得到两个分组集合,每个分组包含所有对应前缀的子列表。
  • map遍历每个分组:对每个分组,我们取分组内第一个元素的car作为新列表的前缀,再用(map cadr group)把分组里所有子列表的第二个元素(颜色+形状的列表)收集起来,作为前缀对应的子项列表。

运行这段代码后,merged-result就是你想要的合并后的结构啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:07:55