我發現自己在emacs lisp中丟失的一件事是,令人驚訝的是,它是一個特殊的列表操作。我想念Python的簡潔列表切片。有沒有Python的[n:m]列表片斷的簡潔emacs lisp?
>>> mylist = ["foo", "bar", "baz", "qux", "frobnitz"]
>>> mylist[1:4]
['bar', 'baz', 'qux']
我看到的功能butlast
和Emacs的文檔中nthcdr
,這將給予同樣的結果,從這樣的代碼:
(setq mylist '("foo" "bar" "baz" "qux" "frobnitz"))
(butlast (nthcdr 1 mylist) 1)
;; ("bar" "baz" "qux")
有沒有得到一個列表的片段比合並更簡潔的方式butlast
和nthcdr
?
相關:http://stackoverflow.com/questions/108169/how-do-i-take-a-slice-of-a-list-a-sublist-in-scheme - 第三個答案建議subseq這是一片;不知道它是否可用在emacs lisp雖然... – l4mpi
啊哈!這正是我期待的,謝謝。像許多其他的Nice Things一樣,subseq也可以通過emacs的'clmacs.el'獲得。此外,將其稱爲「subseq」可能是爲什麼我爲此提出空白谷歌搜索 - 我已經有不止一次使用emacs的術語問題。想要回答,我可以接受嗎? –
不要忘記,Python列表是數組,而Lisp是鏈表,所以性能特點非常不同。如果你需要做大量的索引和子序列,特別是如果列表可能很長,你應該在Lisp中使用不同的類型。 (例如,Python片'mylist [x:y]'是'O(yx)',而Lisp等價物是'O(y)':對於'mylist [50000,50005]'這意味着List將是10000x較慢......) – abarnert