【问题标题】:How to efficiently get rest of a Tcl list starting from an index?如何从索引开始有效地获取 Tcl 列表的其余部分?
【发布时间】:2009-09-16 17:57:03
【问题描述】:

我想获取列表特定索引之后的所有元素。这可以写成:

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

但是,计算列表的长度似乎是一种浪费。如果 lrange 的最后一个参数是可选的并且省略它意味着继续到列表末尾,那就太好了,但是,可惜今天不是这种情况。

在不计算列表长度的情况下,有没有其他方法可以在 Tcl 中有效地做到这一点?

【问题讨论】:

    标签: list performance tcl


    【解决方案1】:

    你可以用“end”代替“[llength $foo]”

    所以...

    puts [lrange $foo 1 end]

    【讨论】:

    • 此外,您可以通过以下方式访问“end”的特定元素偏移量:end-1(第 2 个到最后一个元素)end-7(第 8 个到最后一个元素)Jeff
    • 值得注意的是,此行为记录在手册页中。 lrange 手册页指向字符串手册页,表示索引的工作方式与字符串索引一样。在字符串手册页上,它明确指出“end”是一个有效的索引(并且还提到了 end-1 等)
    【解决方案2】:

    Jeff 很好地回答了您的实际问题。话虽如此,有一点值得注意。获取列表的长度(实际上是引擎盖下的列表)是 O(1),这意味着它不需要真正的时间。列表本身的长度与元数据一起存储,不会重新计算。唯一真正的成本是函数调用的开销。使用“end”可能会更快,只是没有您想象的那么快。

    但“实际上是一个列表”,我的意思是解释器目前正在将其视为一个列表(有更深入的解释,但不值得在这里讨论)。由于您在值上使用 [lrange],解释器必须将其内部转换为列表......所以您几乎可以保证 [llength] 的 O(1) 行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-09
      • 1970-01-01
      • 2012-09-13
      • 1970-01-01
      • 1970-01-01
      • 2015-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多