2009-09-16 73 views
2

我想获得列表中特定索引后面的所有元素。这可以写为:如何从索引开始有效地获取Tcl列表的其余部分?

set foo {0 1 2 3 4 5 6 <...> n} 
puts [lrange $foo 1 [llength $foo]] 

但是,计算列表的长度似乎很浪费。如果lrange的最后一个参数是可选的,并且省略它直到列表结束才会继续,但是,现在情况并非如此,那将会很好。

有没有其他的方式在Tcl中有效地做到这一点,而不计算列表的长度?

回答

7

您可以使用 “结束” 到位 “[llength $ FOO]”

所以......

看跌[lrange $ foo的1月底]的

+0

此外,您可以访问特定的元素通过事物从“结束”偏移,如: 最终1(第2到最后一个元素) 结束-7(第8到最后一个元素) 杰夫 – 2009-09-16 18:15:36

+0

值得一提的是此行为记录在手册页中。 lrange man page指向字符串手册页,表示索引的工作方式与字符串索引类似。在字符串手册页上明确指出“end”是一个有效的索引(并且还提到了end-1等) – 2009-09-17 13:49:04

4

杰夫回答您的实际问题提得好。这就是说,有一件事值得注意。获取列表的长度(实际上是列表中的列表)是O(1),意味着它不需要实时。列表本身的长度与元数据一起存储,不会重新计算。唯一的实际成本是函数调用的开销。使用“结束”可能仍然更快,只是没有你想象的那么多。

但“实际上是引擎盖下的清单”,我的意思是说,解释者目前将其视为一个清单(有更深入的解释,但不值得进入此处)。由于您在值上使用[lrange],因此解释器必须将其内部转换为列表...所以您几乎可以保证[llength]的O(1)行为。

+0

很好的解释 – 2009-09-16 23:57:21

相关问题