Как перечислить диапазон чисел, начиная с 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')]