elegant way to count items

后端 未结 9 2000
感情败类
感情败类 2020-12-10 15:29

I have a list shaped like this:

  \'((\"Alpha\" .  1538)
    (\"Beta\"  .  8036)
    (\"Gamma\" .  8990)
    (\"Beta\"  .  10052)
    (\"Alpha\" .  12837)
           


        
9条回答
  •  被撕碎了的回忆
    2020-12-10 15:37

    (defun freqs (list &optional test key)
      (let ((h (make-hash-table :test test)))
        (dolist (x list)
          (let ((key (if key (funcall key x) x)))
            (puthash key (1+ (gethash key h 0)) h)))
        (let ((r nil))
          (maphash #'(lambda (k v) (push (cons k v) r)) h)
          (sort r #'(lambda (x y) (< (cdr x) (cdr y)))))))
    
    (freqs '(("Alpha" .  1538)
             ("Beta"  .  8036)
             ("Gamma" .  8990)
             ("Beta"  .  10052)
             ("Alpha" .  12837)
             ("Beta"  .  13634)
             ("Beta"  .  14977)
             ("Beta"  .  15719)
             ("Alpha" .  17075)
             ("Rho"   .  18949)
             ("Gamma" .  21118)
             ("Gamma" .  26923)
             ("Alpha" .  31609))
           #'equal #'car)
    

提交回复
热议问题