有没有更好的方法来获取列表中的第n项?

时间:2010-11-24 13:28:09

标签: lisp common-lisp

以下两个表达式是等效的:

(third (list 1 2 3 4))

(first (nthcdr 2 (list 1 2 3 4)))

然而,使用“第三”,“第四”,“第五”等并不总是实用的,(first (nthcdr n list))似乎有点冗长。有没有办法说出像(item 2 (list 1 2 3 4))这样的东西来获取列表中的第n个项目?

2 个答案:

答案 0 :(得分:14)

(nth 3 (list 1 2 3 4))

返回第4项(基于零!)

根据the HyperSpec

  

访问者 NTH

     

说明

     

第n个找到列表 n 元素,其中列表的 car < / em>是“第0个”元素。具体地,

(nth n list) ==  (car (nthcdr n list))
     

<强>示例:

(nth 0 '(foo bar baz)) =>  FOO
(nth 1 '(foo bar baz)) =>  BAR
(nth 3 '(foo bar baz)) =>  NIL
(setq 0-to-3 (list 0 1 2 3)) =>  (0 1 2 3)
(setf (nth 2 0-to-3) "two") =>  "two"
0-to-3 =>  (0 1 "two" 3)

答案 1 :(得分:12)

NTH适用于列表。

ELT适用于序列。序列是列表和各种一维数组(vector,string,...)。

这意味着ELT是更通用的访问器,它不仅适用于列表,还适用于一维数组。