是否有一个与Python';s[n:m]列表切片?

是否有一个与Python';s[n:m]列表切片?,python,emacs,elisp,Python,Emacs,Elisp,令人惊讶的是,我发现自己在emacs lisp中遗漏了一点,那就是列表操作。我怀念Python简洁的列表切片 >>> mylist = ["foo", "bar", "baz", "qux", "frobnitz"] >>> mylist[1:4] ['bar', 'baz', 'qux'] 我在emacs文档中看到了函数butlast和nthcdr,这将从如下代码中得到相同的结果: (setq mylist'(“foo”“bar”“baz”“qux”“fr

令人惊讶的是,我发现自己在emacs lisp中遗漏了一点,那就是列表操作。我怀念Python简洁的列表切片

>>> mylist = ["foo", "bar", "baz", "qux", "frobnitz"]
>>> mylist[1:4]
['bar', 'baz', 'qux']
我在emacs文档中看到了函数
butlast
nthcdr
,这将从如下代码中得到相同的结果:

(setq mylist'(“foo”“bar”“baz”“qux”“frobnitz”))
(但最后一个(nthcdr 1 mylist)1)
;; (“bar”“baz”“qux”)
有没有比组合
butlast
nthcdr
更简洁的方法来获取列表片段?

确实有:

(require 'cl-lib)
(setq mylist '("foo" "bar" "baz" "qux" "frobnitz"))
(cl-subseq mylist 1 4)
;; ("bar" "baz" "qux")
在现代的Emacs中,请注意,
cl
已被弃用,请参见非常好,但如果您的代码库变得很大,并且希望以函数式风格编写简洁的代码,我支持库,它为列表和树操作提供了大量函数。有一个函数的行为类似于Python的切片:

(-slice (number-sequence 1 10) 1 7 2) ; (2 4 6)

参数按顺序排列:列表、开始、(可选)停止、(可选)步骤。

相关:-第三个答案推荐subseq,它是一个切片;不知道它是否在emacs lisp中可用…啊哈!那正是我想要的,谢谢
subseq
和其他许多好东西一样,可以通过emacs的
clmacs.el
获得。此外,称之为“subseq”可能是我在谷歌上搜索这篇文章的原因——我在emacs上不止一次遇到过这样的术语问题。想给出一个答案让我接受吗?别忘了Python
list
s是数组,而Lisp是链表,所以性能特征非常不同。如果需要进行大量的索引和子排序,尤其是列表可能很长的情况下,那么应该在Lisp中使用不同的类型。(例如,Python切片
mylist[x:y]
O(y-x)
,而Lisp等价物是
O(y)
:对于
mylist[5000050005]
,这意味着列表将慢10000x…)感谢您的澄清,abarnert。幸运的是,手头的问题有很多可管理的清单。如果它们变大了,我可能会尝试将它们改为向量。@SeanM
subseq
是一个不错的Emacs术语,这是Lisp调用函数的常见方式。公共Lisp序列是元素的有序集合,可以实现为向量列表,类似于Python也调用序列的抽象。太棒了!正确的、有用的答案现在在Stack Overflow上,谷歌可以很容易地找到它:世界一切都好。:)很高兴为世界服务:-)从版本25开始的Emacs已经发布。