python - numero - numerar automaticamente un campo de una tabla en un shp qgis
Cómo enumerar un rango de números comenzando en 1 (10)
Como ya mencionaste, esto es sencillo de hacer en Python 2.6 o posterior:
enumerate(range(2000, 2005), 1)
Python 2.5 y anteriores no son compatibles con el parámetro de start
, por lo que podría crear dos objetos de rango y comprimirlos:
r = xrange(2000, 2005)
r2 = xrange(1, len(r) + 1)
h = zip(r2, r)
print h
Resultado:
[(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)]
Si desea crear un generador en lugar de una lista, puede usar izip lugar.
Estoy usando Python 2.5, quiero una enumeración como tal (comenzando en 1 en lugar de 0):
[(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)]
Sé que en Python 2.6 puedes hacer: h = enumerar (rango (2000, 2005), 1) para dar el resultado anterior, pero en python2.5 no puedes ...
Usando python2.5:
>>> h = enumerate(range(2000, 2005))
>>> [x for x in h]
[(0, 2000), (1, 2001), (2, 2002), (3, 2003), (4, 2004)]
¿Alguien sabe una forma de obtener ese resultado deseado en Python 2.5?
Gracias,
Jeff
Fácil, solo defina su propia función que hace lo que quiere:
def enum(seq, start=0):
for i, x in enumerate(seq):
yield i+start, x
La forma más simple de hacer en Python 2.5 es exactamente lo que preguntas:
import itertools as it
... it.izip(it.count(1), xrange(2000, 2005)) ...
Si quieres una lista, como it.izip
, usa zip
en lugar de it.izip
.
(Por cierto, como regla general, la mejor manera de hacer una lista de un generador o de cualquier otra X iterable no es [x for x in X]
, sino más bien list(X)
).
Ok, me siento un poco estúpido aquí ... ¿cuál es la razón para no hacerlo con algo así como
[(a+1,b) for (a,b) in enumerate(r)]
? Si no funciona, tampoco hay problema:
>>> 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)]
Solo para poner esto aquí por el bien de la posteridad, en 2.6 el parámetro "start" fue agregado para enumerarlo así:
enumerate(sequence, start=1)
enumerar es trivial, por lo que se vuelve a implementar para aceptar un inicio:
def enumerate(iterable, start = 0):
n = start
for i in iterable:
yield n, i
n += 1
Tenga en cuenta que esto no rompe el código usando enumerar sin argumento de inicio. Alternativamente, este oneliner puede ser más elegante y posiblemente más rápido, pero rompe otros usos de enumerate:
enumerate = ((index+1, item) for index, item)
Este último fue puro disparate. @Duncan tiene el envoltorio correcto.
h = [(i + 1, x) for i, x in enumerate(xrange(2000, 2005))]
>>> h = enumerate(range(2000, 2005))
>>> [(tup[0]+1, tup[1]) for tup in h]
[(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)]
Como esto es algo detallado, recomiendo escribir su propia función para generalizarlo:
def enumerate_at(xs, start):
return ((tup[0]+start, tup[1]) for tup in enumerate(xs))
>>> list(enumerate(range(1999, 2005)))[1:]
[(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)]
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
Ahora h = list(enumerate(xrange(2000, 2005), 1))
funciona.