lisp - 计数元素并返回它们

标签 lisp common-lisp

我想对列表中的元素进行计数并返回一个列表,其中包含与它们各自数量配对的元素

类似的东西:

输入: (计数元素'(a b d d a b c b d d))

输出: ((a 2) (b 3) (d 4) (c 2))

我该怎么做?我没有成功尝试配对元素及其会计

最佳答案

您的问题可以分为三个主要部分:

  1. 重复识别/删除:这可以通过删除每个元素的所有重复项,或者知道当前元素是重复项(因此不将其视为新元素)来完成。这(以前的策略)可以通过使用函数 remove-duplicates 来完成。
  2. 计数:一种实际计数元素的方法。这可以通过函数 count 来完成。
  3. 组合:一种将结果组合成列表的方法。这可以通过宏 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)))

而不是使用 loop , 使用 map .

关于lisp - 计数元素并返回它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44795387/

相关文章:

recursion - LISP 中的 wheres-waldo 函数

lisp - 自定义自引用表格 : Useful?

lisp - 用普通的 lisp 编写一个函数,它将返回一个列表的否定

lisp - 如何在普通 lisp 中将 double-float 转换为字节数组,反之亦然?

lisp - "A micro-manual for Scheme"?

lisp - 检查元素是否在树中

user-interface - 是否有用于 Common Lisp 的高级、易于安装的 GUI 库?

list - lisp 列表连接

list - 逗号在反引号之外是非法的?

tree - 检查 Common Lisp 中的 n 叉树是否平衡