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

Я использую Python 2.5, я хочу, чтобы нумерация была такой (начиная с 1 вместо 0):

[(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)]

Я знаю, что в Python 2.6 вы можете сделать: h = enumerate (range (2000, 2005), 1), чтобы дать результат выше, но в python2.5 вы не можете...

Использование python2.5:

>>> h = enumerate(range(2000, 2005))
>>> [x for x in h]
[(0, 2000), (1, 2001), (2, 2002), (3, 2003), (4, 2004)]

Кто-нибудь знает способ получить желаемый результат в python 2.5?

Спасибо,

Джефф

Ответ 1

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

Ответ 2

Просто для того, чтобы поставить это здесь ради потомства, в 2.6 был добавлен параметр "start" для перечисления следующим образом:

enumerate(sequence, start=1)

Ответ 3

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

def enum(seq, start=0):
    for i, x in enumerate(seq):
        yield i+start, x

Ответ 4

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

import itertools as it

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

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

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

Ответ 5

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

перечисление является тривиальным, и поэтому он повторно реализует его, чтобы принять начало:

def enumerate(iterable, start = 0):
    n = start
    for i in iterable:
        yield n, i
        n += 1

Обратите внимание, что это не прерывает код, используя перечисление без начального аргумента. В качестве альтернативы, этот oneliner может быть более элегантным и, возможно, быстрее, но прерывает другие виды перечисления:

enumerate = ((index+1, item) for index, item)

Последний был чистым вздором. @Duncan получил оболочку справа.

Ответ 7

>>> list(enumerate(range(1999, 2005)))[1:]
[(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)]

Ответ 8

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

Ответ 9

Хорошо, я чувствую себя немного глупо здесь... какая причина не просто делать это с чем-то вроде
[(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)]

Ответ 10

>>> 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))

Ответ 11

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

# Just pass the start argument to enumerate ...
for i,word in enumerate(allWords, 1):
    word2idx[word]=i
    idx2word[i]=word

Ответ 12

Python 3

Официальная документация: enumerate(iterable, start=0)

Так что вы бы использовали это так:

>>> seasons = ['Spring', 'Summer', 'Fall', 'Winter']
>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
>>> list(enumerate(seasons, start=1))
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]