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



спасибо,



Джефф

481   10  

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)

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

Comments

    Ничего не найдено.