Как указано выше, базовые сервлеты не поддерживают шаблоны, как вы указали в своем вопросе. Spring MVC поддерживает шаблоны. Здесь является ссылкой на соответствующий раздел в справочном документе Spring .
Как вы уже упоминали, это просто сделать в Python 2.6 или новее:
enumerate(range(2000, 2005), 1)
Python 2.5 и старше не поддерживают параметр start
, поэтому вместо этого вы можете создать два объекта диапазона и заархивировать их:
r = xrange(2000, 2005)
r2 = xrange(1, len(r) + 1)
h = zip(r2, r)
print h
Результат:
[(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)]
Если вы хотите создать генератор вместо списка, вы можете использовать вместо него izip .
Легко, просто определите свою собственную функцию, которая делает то, что вы хотите:
def enum(seq, start=0):
for i, x in enumerate(seq):
yield i+start, x
Самый простой способ сделать в Python 2.5 именно то, о чем вы спрашиваете:
import itertools as it
... it.izip(it.count(1), xrange(2000, 2005)) ...
Если вам нужен список, как вы видите, используйте zip
вместо ] it.izip
.
(Кстати, как правило, лучший способ составить список из генератора или любого другого итеративного X - это , а не [x вместо x в X]
, но скорее список (X)
).
enumerate тривиален, как и его повторная реализация для принятия start:
def enumerate(iterable, start = 0):
n = start
for i in iterable:
yield n, i
n += 1
Обратите внимание, что это не нарушает код, использующий enumerate без аргумента start. В качестве альтернативы, этот oneliner может быть более элегантным и, возможно, более быстрым, но ломает другие использования enumerate:
enumerate = ((index+1, item) for index, item)
Последнее было чистой бессмыслицей. @Duncan сделал обертку правильно.
from itertools import count, izip
def enumerate(L, n=0):
return izip( count(n), L)
# if 2.5 has no count
def count(n=0):
while True:
yield n
n+=1
Теперь h = list (enumerate (xrange (2000, 2005), 1))
работает.
>>> list(enumerate(range(1999, 2005)))[1:]
[(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)]
h = [(i + 1, x) for i, x in enumerate(xrange(2000, 2005))]
Ладно, я чувствую себя немного глупо... какая причина не делать это просто с чем-то вроде
[(a+1,b) for (a,b) in enumerate(r)]
? Если вы не хотите работать, то тоже не проблема:
>>> r = range(2000, 2005)
>>> [(a+1,b) for (a,b) in enumerate(r)]
[(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)]
>>> enumerate1 = lambda r:((a+1,b) for (a,b) in enumerate(r))
>>> list(enumerate1(range(2000,2005))) # note - generator just like original enumerate()
[(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)]
>>> h = enumerate(range(2000, 2005))
>>> [(tup[0]+1, tup[1]) for tup in h]
[(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)]
Поскольку это несколько многословно, я бы рекомендовал написать свою собственную функцию, чтобы обобщить ее:
def enumerate_at(xs, start):
return ((tup[0]+start, tup[1]) for tup in enumerate(xs))