我想对列表中的元素进行计数并返回一个列表,其中包含与它们各自数量配对的元素
类似的东西:
输入:
(计数元素'(a b d d a b c b d d))
输出:
((a 2) (b 3) (d 4) (c 2))
我该怎么做?我没有成功尝试配对元素及其会计
最佳答案
您的问题可以分为三个主要部分:
- 重复识别/删除:这可以通过删除每个元素的所有重复项,或者知道当前元素是重复项(因此不将其视为新元素)来完成。这(以前的策略)可以通过使用函数
remove-duplicates
来完成。 - 计数:一种实际计数元素的方法。这可以通过函数
count
来完成。 - 组合:一种将结果组合成列表的方法。这可以通过宏
push
来完成。 .
代码:
(defun count-elements (lst)
(loop for i in (remove-duplicates lst)
with ans = nil
do (push (list i (count i lst)) ans)
finally (return ans)))
CL-USER> (count-elements '(a a b c))
((C 1) (B 1) (A 2))
CL-USER> (count-elements '(a b c d d a b s a c d))
((D 3) (C 2) (A 3) (S 1) (B 2))
CL-USER>
注意:由于 remove-duplicates
编辑: 正如 coredump 所指出的,count-elements
的更好版本是:
(defun count-elements (lst)
(map 'list
(lambda (e)
(list e (count e lst)))
(remove-duplicates lst)))
关于lisp - 计数元素并返回它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44795387/