首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在elisp中剥离字符串列表中的重复元素

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

Stack Overflow用户
提问于 2010-09-29 01:32:12
回答 4查看 6K关注 0票数 25

给出一个列表,例如

代码语言:javascript
复制
(list "foo" "bar" nil "moo" "bar" "moo" nil "affe")

如何在删除重复字符串和剥离nil的情况下构建一个新列表,即

代码语言:javascript
复制
(list "foo" "bar" "moo" "affe")

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

我在这里处理的列表很短,所以不需要使用哈希表之类的东西来进行唯一性检查,尽管这样做当然也不会有什么坏处。但是,使用cl功能并不是一个可行的选择。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-09-29 07:19:18

Emacs Lisp Reference Manual"Lists" section中尝试使用"Sets and Lists"

代码语言:javascript
复制
(delq nil (delete-dups (list "foo" "bar" nil "moo" "bar" "moo" nil "affe")))
票数 44
EN

Stack Overflow用户

发布于 2014-03-18 13:27:41

如果你使用的是dash.el库,那就是你所需要的:

代码语言:javascript
复制
(-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:

代码语言:javascript
复制
(-distinct (-keep 'identity '(1 1 nil 2 2 nil 3)) ; => (1 2 3)
票数 5
EN

Stack Overflow用户

发布于 2021-03-05 03:04:21

这是一个简短的示例:

代码语言:javascript
复制
(delete-duplicates '("~/.emacs.d" "~/.emacs.d") :test #'string-equal) ;; '("~/emacs.d")

基本上,您可以使用:test关键字来选择函数string-equal,以测试元素是否重复。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3815467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档