list - Elisp:如何查找列表重复项

标签 list duplicates lisp elisp

我正在使用它来查找列表重复项:

(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 

考虑到 copy-treedelete-dups 的开销,可能有更好的方法。

最佳答案

使用哈希表,一旦你发现一个元素已经存在于哈希表中,你就知道你有重复项:

(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))))

关于list - Elisp:如何查找列表重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49005589/

相关文章:

mysql - 如何从 MySQL 表中删除重复的行

r - 将列表转换为多个数据框,以便能够仅将每个数据框的一列转换为数字数据

python - 在 python 中排序元组列表

mysql - 查找一列不同的 "duplicate"行

python - 如何通过仅保留第一个事件来删除重复,但仅适用于 pandas 上的一个类别

string - 即使最后一个字符是定界符也拆分字符串

lisp - McCLIM,如何捕捉击键?

c++ - 运行时已知大小的二维数组列表(或 vector )的声明

c++ - 列出导致线程本地单例类崩溃的析构函数

lisp - 简单的方案练习。第06章真与假