计算元素并返回它们

时间:2017-06-28 06:46:18

标签: lisp common-lisp

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

配对的元素

类似的东西:

输入: (count-elements '(a b d d a b c c b d d))

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

我该怎么办?我试图配对元素及其会计

没有任何成功

1 个答案:

答案 0 :(得分:1)

您的问题可分为三大部分:

  1. 重复识别/删除:这可以通过删除每个元素的所有重复项,或者通过知道当前元素是重复的(因此不将其作为新元素计算)来完成。这个(前一个策略)可以使用函数remove-duplicates
  2. 来完成
  3. 计数:一种实际计算元素的方法。这可以通过函数count
  4. 来完成
  5. 组合:将结果合并到列表中的一种方法。这可以通过宏push完成。
  6. 守则:

    (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