从列表中创建点对对列表,将其对数划分为另一个数

时间:2018-10-18 13:39:03

标签: list scheme

我有以下列表:

(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都存在问题:需要一个列表。

我该怎么办?

1 个答案:

答案 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)

我真的不认为您应该就地改变数据,所以我将采用我提出的第一个解决方案,即惯用的解决方案。