Как перечислить диапазон чисел, начинающийся с 1

Как указано выше, базовые сервлеты не поддерживают шаблоны, как вы указали в своем вопросе. Spring MVC поддерживает шаблоны. Здесь является ссылкой на соответствующий раздел в справочном документе Spring .

128
задан unutbu 21 July 2010 в 20:41
поделиться

9 ответов

Как вы уже упоминали, это просто сделать в 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 .

154
ответ дан 24 November 2019 в 00:29
поделиться

Легко, просто определите свою собственную функцию, которая делает то, что вы хотите:

def enum(seq, start=0):
    for i, x in enumerate(seq):
        yield i+start, x
13
ответ дан 24 November 2019 в 00:29
поделиться

Самый простой способ сделать в Python 2.5 именно то, о чем вы спрашиваете:

import itertools as it

... it.izip(it.count(1), xrange(2000, 2005)) ...

Если вам нужен список, как вы видите, используйте zip вместо ] it.izip .

(Кстати, как правило, лучший способ составить список из генератора или любого другого итеративного X - это , а не [x вместо x в X] , но скорее список (X) ).

10
ответ дан 24 November 2019 в 00:29
поделиться

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 сделал обертку правильно.

5
ответ дан 24 November 2019 в 00:29
поделиться
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)) работает.

6
ответ дан 24 November 2019 в 00:29
поделиться
>>> list(enumerate(range(1999, 2005)))[1:]
[(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)]
4
ответ дан 24 November 2019 в 00:29
поделиться

h = [(i + 1, x) for i, x in enumerate(xrange(2000, 2005))]

3
ответ дан 24 November 2019 в 00:29
поделиться

Ладно, я чувствую себя немного глупо... какая причина не делать это просто с чем-то вроде
[(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)]
2
ответ дан 24 November 2019 в 00:29
поделиться
>>> 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))
1
ответ дан 24 November 2019 в 00:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: