【问题标题】:Update the second element from a list where the first element is in another list从第一个元素在另一个列表中的列表中更新第二个元素
【发布时间】:2013-11-11 20:23:32
【问题描述】:

也许我的标题有点乱..

我有一个这种形式的清单 (定义一个'((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

  ))

【问题讨论】:

  • 传入的列表是否真的更新了对你有影响吗?例如,(let ((l ...)) (updateA l)) 将返回具有所需结构的 new 列表,但 (let ((l ...)) (updateA l) l) 将返回原始列表(尚未修改)。通常,“更新”一词在这样使用时表明该参数将被修改decrement(和increment)这个词也表明正在修改某些内容。
  • @JoshuaTaylor 在 Scheme 世界中,更新并不一定意味着突变,除非还使用了“就地”一词。

标签: list for-loop scheme


【解决方案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))

【讨论】:

  • 如果这适用于@dionysosz,太好了!我要指出的是,这将返回一个具有所需结构的 new 列表;它不是更新现有列表。
  • @JoshuaTaylor 从技术上讲是正确的,但是在 Scheme 中,实际上并不推荐使用变异的东西,所以它已经足够好了。不过,我可以添加一个变异版本。
  • 我同意这不是特别地道,但它肯定是可能的。我只提到这一点是因为 OP 说 update (但话又说回来,也接受了答案说这是要寻找的)。我添加了对问题的评论以要求澄清。我认为递减这个词也暗示了修改而不是分配一个新的结构。
  • @JoshuaTaylor 在这里,我添加了一个变异版本。
猜你喜欢
  • 2013-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多