Как эффективно получить остальную часть списка Tcl, начиная с индекса?

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

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

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

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


person WilliamKF    schedule 16.09.2009    source источник


Ответы (2)


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

So...

ставит [lrange $foo 1 конец]

person Jeff Godfrey    schedule 16.09.2009
comment
Кроме того, вы можете получить доступ к определенному смещению элемента от конца с помощью таких вещей, как: end-1 (от 2-го до последнего элемента) end-7 (от 8-го до последнего элемента) Джефф - person Jeff Godfrey; 16.09.2009
comment
Стоит отметить, что это поведение задокументировано на справочных страницах. Справочная страница lrange указывает на справочную страницу строки, говоря, что индексы работают точно так же, как строковые индексы. На справочной странице строки явно указано, что конец является допустимым индексом (а также упоминается конец-1 и т. д.) - person Bryan Oakley; 17.09.2009

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

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

person RHSeeger    schedule 16.09.2009