2012-11-01 43 views
16

我發現自己在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") 

有沒有得到一個列表的片段比合並更簡潔的方式butlastnthcdr

+3

相關:http://stackoverflow.com/questions/108169/how-do-i-take-a-slice-of-a-list-a-sublist-in-scheme - 第三個答案建議subseq這是一片;不知道它是否可用在emacs lisp雖然... – l4mpi

+1

啊哈!這正是我期待的,謝謝。像許多其他的Nice Things一樣,subseq也可以通過emacs的'clmacs.el'獲得。此外,將其稱爲「subseq」可能是爲什麼我爲此提出空白谷歌搜索 - 我已經有不止一次使用emacs的術語問題。想要回答,我可以接受嗎? –

+3

不要忘記,Python列表是數組,而Lisp是鏈表,所以性能特點非常不同。如果你需要做大量的索引和子序列,特別是如果列表可能很長,你應該在Lisp中使用不同的類型。 (例如,Python片'mylist [x:y]'是'O(yx)',而Lisp等價物是'O(y)':對於'mylist [50000,50005]'這意味着List將是10000x較慢......) – abarnert

回答

19

肯定有:

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

太棒了!正確的,有用的答案現在在Stack Overflow上,Google可以很容易地找到答案:所有的東西都適合世界。 :) –

+1

很高興能爲世界服務:-) –

2

Common Lisp library是偉大的,但如果你的代碼庫變大,你想要寫函數式簡潔的代碼,我贊同dash.el庫,它提供的功能,大量的名單,樹操作。還有一個功能-slice,其行爲就像Python的切片:

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

參數是爲了:列出,啓動(可選)停止,(可選)的步驟。

相關問題