web-dev-qa-db-fra.com

Comment énumérer une plage de nombres commençant à 1

J'utilise Python 2.5, je veux une énumération comme celle-ci (commençant à 1 au lieu de 0):

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

Je sais dans Python 2.6, vous pouvez faire: h = énumérer (plage (2000, 2005), 1), pour donner le résultat ci-dessus, mais vous ne pouvez pas utiliser python2.5 ...

Utilisation de python2.5:

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

Est-ce que quelqu'un connaît un moyen d'obtenir ce résultat souhaité en python 2.5?

Merci,

Jeff

127
JeffTaggary

Comme vous l'avez déjà mentionné, ceci est simple à faire dans Python 2.6 ou plus récent:

enumerate(range(2000, 2005), 1)

Python 2.5 et les versions antérieures ne supportent pas le paramètre start, vous pouvez donc créer deux objets de plage et les compresser:

r = xrange(2000, 2005)
r2 = xrange(1, len(r) + 1)
h = Zip(r2, r)
print h

Résultat:

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

Si vous voulez créer un générateur à la place d'une liste, vous pouvez utiliser izip .

146
Mark Byers

Juste pour mettre ceci ici pour des raisons de postérité, dans 2.6 le paramètre "start" a été ajouté pour énumérer comme ceci:

enumerate(sequence, start=1)

151
dhackner

Facile, définissez simplement votre propre fonction qui fait ce que vous voulez:

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

La manière la plus simple de faire Python 2.5 exactement ce que vous demandez:

import itertools as it

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

Si vous voulez une liste, utilisez l'apparence suivante: Zip à la place de it.izip.

(BTW, en règle générale, le meilleur moyen de créer une liste à partir d’un générateur ou de tout autre X ité est le et non [x for x in X] , mais plutôt list(X)).

10
Alex Martelli
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

Maintenant, h = list(enumerate(xrange(2000, 2005), 1)) fonctionne.

6
Jochen Ritzel

énumérer est trivial, et donc le ré-implémenter pour accepter un début:

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

Notez que cela ne rompt pas le code en utilisant énumérer sans argument de démarrage. Alternativement, cet oneliner peut être plus élégant et peut-être plus rapide, mais casse d'autres utilisations d'énumérer:

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

Ce dernier était un pur non-sens. @ Duncan a bien emballé l'emballage.

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

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

3
Chris B.

Ok, je me sens un peu stupide ici ... quelle est la raison pour ne pas le faire avec quelque chose comme
[(a+1,b) for (a,b) in enumerate(r)] ? Si vous ne voulez pas fonctionner, pas de problème non plus:

>>> 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
Nas Banov

Python 3

Documentation officielle: enumerate(iterable, start=0)

Donc, vous l'utiliseriez comme ceci:

>>> 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')]
1
winklerrr
>>> h = enumerate(range(2000, 2005))
>>> [(tup[0]+1, tup[1]) for tup in h]
[(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)]

Comme c'est un peu bavard, je vous recommande d'écrire votre propre fonction pour la généraliser:

def enumerate_at(xs, start):
    return ((tup[0]+start, tup[1]) for tup in enumerate(xs))
1
Eli Courtwright

Je ne sais pas comment ces messages pourraient être plus compliqués que ce qui suit:

# Just pass the start argument to enumerate ...
for i,Word in enumerate(allWords, 1):
    Word2idx[Word]=i
    idx2Word[i]=Word
0
bmc