在 Beginner Racket 中创建 Python 的 collections.counter() 方法

Create Python's collections.counter() method in Beginner Racket

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

(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))

我已经很久没有使用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 语句检查我们的列表列表中是否已经存在该键的条目,returns 如果是,则匹配对,否则 false

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

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