0

可能我的标题有点乱。。

我有一个这种形式的列表(定义一个'((1 3)(2 2)(3 3)(4 5)(5 1)))

我想减1,每对的第二个元素在给定列表中具有第一个元素...

例如..(更新A(1 3 4))

将导致

( (1 2) (2 2) (3 2) (4 4) (5 1)

(define (updateA lst)
      (for ((x lst))
        (for ((y a))
          (equal? x (car y)))
          ;;do something here

  ))
4

1 回答 1

1

这是一个实现:

(define (decrement-alist-values alist keys)
  (map (lambda (ass)
         (if (member (car ass) keys)
             (list (car ass) (- (cadr ass) 1))
             ass))
       alist))

例子:

> (decrement-alist-values '((1 3) (2 2) (3 3) (4 5) (5 1))
                          '(1 3 4))
((1 2) (2 2) (3 2) (4 4) (5 1))

Joshua Taylor 提到我的版本在技术上并没有通过突变更新列表。这是一个公平的观点,所以这里是一个变异版本:

(define (decrement-alist-values! alist keys)
  (for-each (lambda (ass)
              (when (member (car ass) keys)
                (set-car! (cdr ass) (- (cadr ass) 1))))
            alist))

例子:

> (define a `(,(list 1 3) ,(list 2 2) ,(list 3 3) ,(list 4 5) ,(list 5 1)))
> (decrement-alist-values! a '(1 3 4))
> a
((1 2) (2 2) (3 2) (4 4) (5 1))
于 2013-11-11T20:31:04.120 回答