首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在(emacs) lisp中提取/切片/重新排序列表?

在(emacs) lisp中提取/切片/重新排序列表?
EN

Stack Overflow用户
提问于 2010-05-25 08:26:16
回答 3查看 1.2K关注 0票数 6

在python中,您可能会这样做

代码语言:javascript
复制
i = (0, 3, 2)
x = [x+1 for x in range(0,5)]
operator.itemgetter(*i)(x)

去找(1, 4, 3)。在(emacs) lisp中,我编写了一个名为extract的函数,它做类似的事情,

代码语言:javascript
复制
(defun extract (elems seq)
  (mapcar (lambda (x) (nth x seq)) elems))

(extract '(0 3 2) (number-sequence 1 5))

但是我觉得应该有一些内置的东西?我只知道first, last, rest, nth, car, cdr..。路在何方?~提前谢谢~

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-05-25 18:55:41

如果你的问题是速度,那么使用(vector 1 2 3 4 5)而不是list,和(aref vec index)来获取元素。

代码语言:javascript
复制
(defun extract (elems seq)
  (let ((av (vconcat seq)))
    (mapcar (lambda (x) (aref av x)) elems)))

如果你打算多次从同一个序列中提取,那么在一个向量中只存储一次这个序列当然是有意义的。Python列表实际上是一维数组,而LISP中的等价物是向量。

票数 4
EN

Stack Overflow用户

发布于 2010-05-25 10:25:59

我只用elisp编写过简单的脚本,但它是一种相对较小的语言。在链表上,extract是一个非常低效的函数,而链表是emacs lisp中的默认数据结构。所以它不太可能是内置的。

您的解决方案是最好的、直接的。它是n^2,但是为了使它更快,需要更多的代码。

下面是对它如何工作的猜测,但也可能是完全错误的:

  1. sort elems (n log N)
  2. 创建一个映射,将排序的elem中的元素映射到它们在原始代码中的索引(可能是n log n,也可能是n)
  3. 遍历<代码>D10和排序的<代码>D11。只保留已排序映射中的索引(可能是n,也可能是n elem n,这取决于它是散列映射还是树映射)
  4. 根据elem映射(n log n)

的值对结果进行排序

票数 2
EN

Stack Overflow用户

发布于 2010-05-25 10:27:38

来自My Lisp Experiences and the Development of GNU Emacs

在那些日子里,在1985年,有人拥有1兆字节的机器,没有虚拟内存。

。他们希望能够使用GNU Emacs。这意味着我必须让程序尽可能的小。

例如,当时唯一的循环结构是‘while’,这非常简单。没有办法打破‘while’语句,你只需要做一个catch和一次抛出,或者测试一个运行循环的变量。这显示了我为了让事情变得更小而走了多远。我们没有‘caar’和‘cadr’之类的东西;“排挤一切可能”从一开始就是GNU Emacs的精神,Emacs Lisp的精神。

显然,机器现在变得更大了,我们不再这样做了。我们放入‘caar’和‘cadr’等等,也许有一天我们会放入另一个循环结构。

所以我的猜测是,如果你看不到它,它就不在那里。

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

https://stackoverflow.com/questions/2901255

复制
相关文章

相似问题

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