代码之家  ›  专栏  ›  技术社区  ›  rafl

在elisp中剥离字符串列表中的重复元素

  •  19
  • rafl  · 技术社区  · 14 年前

    给出一个列表,例如

    (list "foo" "bar" nil "moo" "bar" "moo" nil "affe")
    

    nil 脱光衣服,即。

    (list "foo" "bar" "moo" "affe")
    

    元素的顺序需要保留-字符串的第一次出现不能被删除。

    cl 功能不是一个可行的选择。

    4 回复  |  直到 14 年前
        1
  •  0
  •   Sean    14 年前

    给你:

    (defun strip-duplicates (list)
      (let ((new-list nil))
        (while list
          (when (and (car list) (not (member (car list) new-list)))
            (setq new-list (cons (car list) new-list)))
          (setq list (cdr list)))
        (nreverse new-list)))
    
        2
  •  42
  •   aculich    11 年前

    "Sets and Lists" "Lists" section Emacs Lisp Reference Manual

    (delq nil (delete-dups (list "foo" "bar" nil "moo" "bar" "moo" nil "affe")))
    
        3
  •  18
  •   Gilles 'SO- stop being evil'    14 年前

    Common Lisp package 包含许多列表操作函数,特别是 remove-duplicates .

    (require 'cl)
    (remove-duplicates (list "foo" "bar" nil "moo" "bar" "moo" nil "affe")
                       :test (lambda (x y) (or (null y) (equal x y)))
                       :from-end t)
    

    cl . 但我仍然认为这是一种正确的方法,可以让其他人读到这篇文章。

    对你来说不可行?它已经与Emacs一起发布了大约20年了,这还不包括过去版本中功能较少的版本。)

        4
  •  4
  •   Mirzhan Irkegulov    9 年前

    dash.el 图书馆,这就是你所需要的:

    (-distinct (-non-nil '(1 1 nil 2 2 nil 3)) ; => (1 2 3)
    

    -distinct 删除列表中的重复元素, -non-nil 删除 nil

    -非零 是在版本2.9中添加的,因此如果出于某种原因您必须使用早期版本,另一种实现方法是使用 -keep 内置 identity 函数,它只返回给定的值: (identity 1) ; => 1 . 我们的想法是 只保留谓词返回true(Lisp行话中为非nil)的元素。 显然,仅对非nil的值返回非nil:

    (-distinct (-keep 'identity '(1 1 nil 2 2 nil 3)) ; => (1 2 3)
    
        5
  •  1
  •   kcurtet    3 年前

    这是一个简短的例子:

    (delete-duplicates '("~/.emacs.d" "~/.emacs.d") :test #'string-equal) ;; '("~/emacs.d")
    

    :test 关键字来选择函数 string-equal 测试元素是否重复。

    否则默认函数测试不会检查字符串相等性。