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
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 .
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)
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
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)
).
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.
é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.
>>> 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))]
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)]
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')]
>>> 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))
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