首页 > 解决方案 > 在 Beginner Racket 中创建 Python 的 collections.counter() 方法

问题描述

目标是创建一个接受符号列表并生成键值对列表的函数,该列表计算列表中每个符号出现的次数。例如:

(counter (list 't 't 'c 'a)) -> (list (list 't 2) (list 'c 1) (list 'a 1))

函数必须用递归完成

我只创建了一个将重复项视为独立值的键值对列表:

(define val 0)

(define (counter los)
  (cond
    [(empty? los) empty]
    [else (cons (list (first los) (add1 val))
                (counter (rest los)))]))

(counter (list 't 't 'c 'a)) -> (list (list 't) (list 't) (list 'c 1) (list 'a 1))

标签: racket

解决方案


自从我使用 BSL 以来已经很长时间了,但我相信这些操作都存在。可能有一种更简洁的方法,但我会留给您检查文档并尽可能简化它

(define (counter los) (counter-helper los empty))
(define (counter-helper los lists)
  (cond
    [(empty? los) lists] 
    [else (if (list? (assq (first los) lists))
                (counter-helper
                 (rest los)
                 (cons (list (first los) (add1 (second (assq (first los) lists))))
                      (remove (assq (first los) lists) lists)))
                (counter-helper (rest los) (cons (list (first los) 1) lists)))]))

if语句检查我们的列表列表中是否已经存在该键的条目,如果是,则返回该对,false否则返回。

如果结果是false我们只需附加一个值为 1 的新对并重复。

如果它已经存在,我们从前一个中构造一个新的对,具有相同的键,但值增加,并将这个新对附加到我们的列表列表中 - 前一个对被删除


推荐阅读