我有以下列表:
(define lista '((a . 1) (b . 2) (c . 3)))
我想用以下变量将对(1、2和3)上的每个数字除以另一个数字:
(define sum 6)
我想将结果更改为每对,以获得这样的列表:
'((a . 1.66667) (b . 0.33333) (c . 0.5)))
我尝试过以下句子:
(map / cdr lista sum)
和
(map / (cdr lista) sum)
和
(map / (map cdr lista) sum)
但是,在所有情况下,sum
函数中的参数map
都存在问题:需要一个列表。
我该怎么办?
答案 0 :(得分:1)
比看起来有些棘手。您需要创建一个新对,因为(通常)您不能修改现有对,因此map
会返回一个新列表:
; returns a new list
#lang racket
(map (lambda (p) (cons (car p) (/ (cdr p) sum)))
lista)
如果要使用set-cdr!
修改现有的配对,则应使用for-each
而不是map
,并更改为支持配对突变的语言:>
; modifies list in-place
#lang r5rs
(for-each (lambda (p) (set-cdr! p (/ (cdr p) sum)))
lista)
我真的不认为您应该就地改变数据,所以我将采用我提出的第一个解决方案,即惯用的解决方案。