DrRacket Scheme中替换列表内每个元组首元素为数字的实现方法
嘿,这事儿不难搞定!我来给你写个在DrRacket里处理这个列表的方案,一步一步来~
首先得明确你需要的首元素到数字的映射规则,我先默认用下面这个映射(要是你的规则不一样,改起来超简单):
R→ 1p→ 2t→ 3
接下来我们写代码实现:
完整代码示例
; 第一步:定义首元素到对应数字的转换函数 (define (elem-to-num elem) (cond [(eq? elem 'R) 1] [(eq? elem 'p) 2] [(eq? elem 't) 3] [else elem])) ; 遇到未知元素就保持原样,避免报错 ; 第二步:处理单个点对(就是你列表里的每个(R.1)这种元素) (define (process-pair a-pair) ; 把点对的首元素换成对应数字,保留后面的数值部分 (cons (elem-to-num (car a-pair)) (cdr a-pair))) ; 第三步:处理整个列表 (define original-list '((R . 1) (R . 5) (R . 2) (R . 4) (p . 3) (t . 6) (R . 7))) (define result-list (map process-pair original-list)) ; 运行后查看结果 result-list
运行结果
当你在DrRacket里运行这段代码,会得到:
'((1 . 1) (1 . 5) (1 . 2) (1 . 4) (2 . 3) (3 . 6) (1 . 7))
灵活调整的小技巧
- 如果你的映射规则变了(比如
R要对应0,t对应9),直接修改elem-to-num函数里的返回值就行,比如把[(eq? elem 'R) 1]改成[(eq? elem 'R) 0]。 - 要是你的列表元素不是点对(比如是
(R 1)这种普通列表),只需要把process-pair函数里的(cdr a-pair)改成(cadr a-pair),然后把cons换成list,就能得到(1 1)这种结构的结果啦。
内容的提问来源于stack exchange,提问作者D.P.
相关产品推荐
相关产品推荐

