Как перечислить ряд чисел, начиная с 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?
спасибо,
Джефф
10 ответов:
как вы уже упоминали, это просто сделать в Python 2.6 или новее:
enumerate(range(2000, 2005), 1)Python 2.5 и старше не поддерживают
startпараметр так что вместо этого вы можете создать два объекта диапазона и zip их: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.6 параметр "start" был добавлен для перечисления следующим образом:
enumerate(sequence, start=1)
легко, просто определить собственную функцию, которая делает то, что вы хотите:
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 for x in X], аlist(X)).
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))строительство.
перечисление тривиально, и поэтому повторно реализует его, чтобы принять начало:
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)
хорошо, я чувствую себя немного глупо здесь... почему не просто сделать что-то вроде
[(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))
Comments