Elisp:如何查找列表重复项

ant*_*nio 3 lisp elisp list duplicates

我用它来查找列表重复:

(defun have-dups (x)
  (let ((dups (copy-tree x)))
    (if (eq (length (delete-dups dups)) (length x))
    nil
      t)))

(have-dups (list 1 2 3 3)) ;=> t
(have-dups (list 1 2 3))   ;=> nil 
Run Code Online (Sandbox Code Playgroud)

考虑到copy-tree和的开销delete-dups,可能有更好的方法.

cor*_*ump 5

使用哈希表,只要找到哈希表中已存在的元素,就知道你有重复项:

(defun has-dup (list)
  (block nil
    (let ((hash (make-hash-table :test 'eql)))
      (map ()
           (lambda (item)
             (if (gethash item hash)
                 (return t)
               (setf (gethash item hash) t)))
           list))))
Run Code Online (Sandbox Code Playgroud)

  • @AntonMalyshev在elisp`defun`中并没有建立一个块.最后的"nil"似乎没有必要(因为`(map()...)`总是会返回`nil`),但我认为它是为了可读性. (2认同)