【问题标题】:Is there a concise emacs lisp equivalent of Python's [n:m] list slices?是否有一个简洁的 emacs lisp 等效于 Python 的 [n:m] 列表切片?
【发布时间】: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 也称为序列的抽象。

标签: python emacs elisp


【解决方案1】:

当然有:

(require 'cl-lib)
(setq mylist '("foo" "bar" "baz" "qux" "frobnitz"))
(cl-subseq mylist 1 4)
;; ("bar" "baz" "qux")

在现代 Emacs 中,请注意 cl 已弃用,请参阅 In Emacs, what does this error mean? "Warning: cl package required at runtime"

【讨论】:

  • 太棒了!正确、有用的答案现在在 Stack Overflow 上,Google 可以轻松找到它:世界一切都好。 :)
  • 很高兴为世界服务:-)
  • Emacs,从版本 25 开始,有seq-subseq。
【解决方案2】:

Common Lisp library 很棒,但是如果您的代码库变得很大并且您想以函数式风格编写简洁的代码,我支持dash.el 库,它提供了大量用于列表和树操作的函数。有一个函数-slice 的行为就像 Python 的切片:

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

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

【讨论】:

    猜你喜欢
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 2010-09-06
    • 1970-01-01
    相关资源
    最近更新 更多