【发布时间】:2023-03-31 15:42:01
【问题描述】:
我发现自己在 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"))
(butlast (nthcdr 1 mylist) 1)
;; ("bar" "baz" "qux")
有没有比组合butlast 和nthcdr 更简洁的获取列表切片的方法?
【问题讨论】:
-
相关:stackoverflow.com/questions/108169/… - 第三个答案推荐 subseq ,它是一个切片;不知道它是否在 emacs lisp 中可用...
-
啊哈!这正是我要找的,谢谢。
subseq和许多其他不错的东西一样,可以通过 emacs 的clmacs.el获得。此外,将其称为“subseq”可能是我为此空白谷歌搜索的原因——我在使用 emacs 时不止一次遇到过类似的术语问题。想要回答以便我接受吗? -
别忘了 Python
lists 是数组,而 Lisp 是链表,所以性能特点有很大不同。如果你需要做大量的索引和子排序,特别是如果列表可能很长,你应该在 Lisp 中使用不同的类型。 (例如,Python 切片mylist[x:y]是O(y-x),而 Lisp 等价物是O(y):对于mylist[50000,50005],这意味着 List 将慢 10000 倍……) -
感谢您的澄清,阿巴纳特。幸运的是,手头的问题有可管理大小的列表。如果它们变大,我可能会尝试将它们更改为向量。
-
@SeanM
subseq是不错的 Emacs 术语,Common Lisp 就是这样调用函数的。 Common Lisp 序列是元素的有序集合,可以实现为向量列表,类似于 Python 也称为序列的抽象。