racket - 在 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))
解决方案
自从我使用 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 的新对并重复。
如果它已经存在,我们从前一个中构造一个新的对,具有相同的键,但值增加,并将这个新对附加到我们的列表列表中 - 前一个对被删除
推荐阅读
- java - 如何知道用户没有给我们的应用程序提供互联网访问权限?
- php - 将两个小时添加到从 MySQL 数据库中获取的数据
- node.js - 如何在 Nativescript 8 和 Angular 中生成组件
- python - django / ajax 表单提交收到 405 错误但有效吗?
- php - 将静态数据从一个 php 发送到另一个
- dart - 如何在自动保存时向 Dart 代码添加分号?
- elasticsearch - Elasticsearch 的问题 - 即使插入 API 只运行一次,Elasticsearch 也会插入两条或更多记录
- flutter - Flutter:问题/答案列表每页查看一项(例如 Taxfix)
- if-statement - Makeifle:如果定义块中的条件块
- python - DJANGO ORM - 在案例中使用时间列表更新/添加字段