una tabla shp numero numerar generar enumerar correlativo conteo consecutivo campos campo calculadora automaticamente python enums

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.