在 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 1 5))
但我觉得应该内置一些东西?我只知道 first, last, rest, nth, car, cdr
... 要走的路是什么? ~ 提前致谢 ~
最佳答案
如果您的问题是速度,则使用 (vector 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 中的等价物是向量。
关于lisp - 在(emacs)lisp 中提取/切片/重新排序列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2901255/