Как эффективно получить остаток списка Tcl, начиная с индекса? - PullRequest
2 голосов
/ 16 сентября 2009

Я хотел бы получить все элементы после определенного индекса списка. Это может быть записано как:

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

Однако вычисление длины списка кажется пустой тратой. Было бы неплохо, если бы последний аргумент для lrange был необязательным, и его пропуск означал продолжение до конца списка, но, увы, сегодня это не так.

Есть ли какой-то другой способ сделать это эффективно в Tcl без вычисления длины списка?

Ответы [ 2 ]

7 голосов
/ 16 сентября 2009

Вы можете использовать «end» вместо «[llength $ foo]»

Итак ...

ставит [lrange $ foo 1 end]

4 голосов
/ 17 сентября 2009

Джефф хорошо ответил на твой вопрос. При этом, есть одна вещь, которую стоит отметить. Получение длины списка (это на самом деле список изнутри) имеет значение O (1), что означает, что это не требует реального времени. Длина самого списка хранится вместе с метаданными и не пересчитывается. Единственная реальная стоимость - это накладные расходы на вызов функции. Использование «конца», вероятно, все еще быстрее, но не так много, как вы могли подумать.

Но "на самом деле список под капотом", я имею в виду, что переводчик в настоящее время рассматривает его как список (есть более глубокое объяснение, но здесь не стоит вдаваться) Поскольку вы используете [lrange] для значения, интерпретатор должен преобразовать его внутренне в список ... так что вы в значительной степени гарантируете поведение O (1) [llength].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...