在(emacs)lisp中提取/切片/重新排序列表?
在python中,您可以执行以下操作在(emacs)lisp中提取/切片/重新排序列表?,lisp,elisp,Lisp,Elisp,在python中,您可以执行以下操作 i = (0, 3, 2) x = [x+1 for x in range(0,5)] operator.itemgetter(*i)(x) 获取(1,4,3)。 在(emacs)lisp中,我编写了一个名为extract的函数,它做了类似的事情 (defun extract (elems seq) (mapcar (lambda (x) (nth x seq)) elems)) (extract '(0 3 2) (number-sequence
i = (0, 3, 2)
x = [x+1 for x in range(0,5)]
operator.itemgetter(*i)(x)
获取(1,4,3)
。
在(emacs)lisp中,我编写了一个名为extract的函数,它做了类似的事情
(defun extract (elems seq)
(mapcar (lambda (x) (nth x seq)) elems))
(extract '(0 3 2) (number-sequence 1 5))
但我觉得应该有一些内在的东西?我只知道
第一个、最后一个、休息、第n个、汽车、cdr
。。。怎么走?~提前感谢~我只使用elisp编写了简单的脚本,但它是一种相对较小的语言。而extract
在链表上是一个非常低效的函数,这是emacs lisp中的默认数据结构。所以它不太可能是内置的
您的解决方案是最简单的。它是n^2,但是要使它更快,需要更多的代码
下面是对其工作原理的猜测,但也可能完全偏离了基准:
elems
(n日志n)elem
中的元素映射到其原始elem
中的索引(可能是n log n,可能是n)seq
并排序elem
。仅在已排序的元素中保留索引(可能是n,可能是n log n,取决于它是哈希映射还是树映射)
元素的值对结果进行排序
映射(n log n)因此,我的猜测是,如果你看不到它,它就不在那里。如果你的问题是速度,那么使用(向量1 2 3 4 5)而不是列表和(aref vec index)来获取元素
(defun extract (elems seq)
(let ((av (vconcat seq)))
(mapcar (lambda (x) (aref av x)) elems)))
如果要多次从同一序列中提取,那么只需将序列存储在向量中一次就有意义了。
Python列表实际上是一维数组,LISP中的等价物是向量。不知道这一点。所以对于这个问题,我必须决定创建向量的开销是否值得常数时间访问的额外开销。