给出一个列表,例如
(list "foo" "bar" nil "moo" "bar" "moo" nil "affe")
如何在删除重复字符串和剥离nil
的情况下构建一个新列表,即
(list "foo" "bar" "moo" "affe")
元素的顺序需要保留-字符串的第一次出现可能不会被删除。
我在这里处理的列表很短,所以不需要使用哈希表之类的东西来进行唯一性检查,尽管这样做当然也不会有什么坏处。但是,使用cl
功能并不是一个可行的选择。
发布于 2010-09-29 07:19:18
在Emacs Lisp Reference Manual的"Lists" section中尝试使用"Sets and Lists"
(delq nil (delete-dups (list "foo" "bar" nil "moo" "bar" "moo" nil "affe")))
发布于 2014-03-18 13:27:41
如果你使用的是dash.el
库,那就是你所需要的:
(-distinct (-non-nil '(1 1 nil 2 2 nil 3)) ; => (1 2 3)
dash.el
是由Magnar Sveen编写的,它是一个强大的列表操作库,具有许多用于各种任务的函数。如果你写了很多Elisp代码,我建议你安装它。-distinct
函数删除列表中的重复元素,-non-nil
删除nil
元素。虽然上面的代码已经足够了,但下面我描述了一种替代方法,所以请随意忽略本文的其余部分。
-non-nil
是在2.9版本中添加的,所以如果出于某种原因您必须使用早期版本,另一种实现相同功能的方法是使用带有内置identity
函数的-keep
,该函数只返回给定的任何内容:(identity 1) ; => 1
。其思想是-keep
只保留谓词返回true ( Lisp行话中的“non-nil”)的元素。显然,identity
只为非nil的任何值返回非nil:
(-distinct (-keep 'identity '(1 1 nil 2 2 nil 3)) ; => (1 2 3)
发布于 2021-03-05 03:04:21
这是一个简短的示例:
(delete-duplicates '("~/.emacs.d" "~/.emacs.d") :test #'string-equal) ;; '("~/emacs.d")
基本上,您可以使用:test
关键字来选择函数string-equal
,以测试元素是否重复。
否则,默认的函数测试不会检查字符串是否相等。
https://stackoverflow.com/questions/3815467
复制相似问题