2012-07-14 20 views
69

Estoy tratando de hacer una lista con los números 1-1000 en él. Obviamente, sería molesto escribir/leer, así que estoy tratando de hacer una lista con un rango. En Python 2 parece que:Python 3 rango de vueltas a una lista

some_list = range(1,1000) 

hubiera funcionado, pero en Python 3 el rango es similar a la de Python xrange 2?

¿Alguien puede darnos una idea de esto?

+4

Simplemente no lo haga, ¿por qué realmente necesitaría una lista de 1,000 números del 1 al 1000? Use el rango cada vez que necesite dicha lista. –

+0

también, 'some_list [i] == i + 1', por lo que probablemente no necesite una lista de todos modos. – njzk2

+0

@RikPoggi. por ejemplo, uno podría necesitar proporcionar una lista para una función de trazado. A veces un rango será suficiente, pero un rango no puede concatenarse (es inmutable), por lo que si necesita agregar un valor de inicio predeterminado a todas las listas que se trazan, también debe convertirse en una lista. – SherylHohman

Respuesta

4

Realmente no debería necesitar usar los números 1-1000 en una lista. Pero si por alguna razón usted necesita realmente estos números, entonces se podría hacer:

[i for i in range(1, 1001)] 

lista por comprensión en pocas palabras:

La lista anterior comprensión se traduce en:

nums = [] 
for i in range(1, 1001): 
    nums.append(i) 

Este es solo la sintaxis de comprensión de lista, aunque desde 2.x. Sé que esto funcionará en Python 3, pero no estoy seguro si hay una sintaxis actualizada también

El rango comienza incluyendo el primer parámetro; pero termina hasta, Sin incluir el segundo parámetro (cuando se suministra 2 parámetros, si el primer parámetro se deja fuera, va a empezar a '0')

range(start, end+1) 
[start, start+1, .., end] 
+9

¿Por qué la comprensión? Solo: 'lista (rango (1000))' –

+0

¡Gracias! ¿Te importaría explicar por qué es para mí en ... en lugar de simplemente para mí? – Boathouse

+0

No he trabajado con python3. Entonces no estoy completamente seguro de cómo funciona. Sé que las comprensiones funcionarán, pero no fue 100% en el casting. Pero si el casting funciona, entonces tienes razón y tu camino es más pitónico. – inspectorG4dget

92

puede simplemente construir una lista de la rango objeto:

my_list=list(range(1,1001)) 

Así es como lo haces con los generadores en python2.x también. Por lo general, es probable que no necesite una lista, ya que puede obtener el valor my_list[i] de manera más eficiente (i+1), y si solo necesita repetirlo, puede recurrir al range.

También tenga en cuenta que en python2.X, xrange sigue siendo indexable . Esto significa que en range python3.x también tiene la misma propiedad

print xrange(30)[12] obras para python2.X

La declaración análoga a en python3.x es print(range(30)[12]) y eso funciona también.

+3

Este es definitivamente el camino a seguir, pero un detalle: esto no es realmente un "elenco" – jterrace

+0

@jterrace cambió "lanzar" a "convertir". Tienes razón al decir que no es un elenco ... Realmente no sé cómo llamarlo exactamente. – mgilson

+1

Yo diría "construir" o "construir" (o posiblemente "materializar") - como no está "convirtiendo" (como tal) un generador a una lista, está creando un nuevo objeto de lista a partir de una fuente de datos que pasa a ser un generador ... (pero s'pose solo dividir pelos y no está 100% seguro de lo que favorezco de todos modos) –

2

En realidad, si quieres 1-1000 (ambos inclusive), utilice la función range(...) con los parámetros 1 y 1001: range(1, 1001), porque la función range(start, end) va de principio a (extremo-1), ambos inclusive.

14

en Python 3.x, la función range() tiene su propio tipo. lo que en este caso se debe utilizar iterador

list(range(1000))

+3

"en este caso debe usar el iterador"? ¿Qué diablos se supone que significa eso? – user2357112

5

En pitones < = 3.4 puede, como otros sugirieron, usar list(range(10)) para hacer una lista de un rango (en general, cualquier iterable).

Otra alternativa, introducida en Python 3.5 con sus generalizaciones de desembalaje, es mediante el uso * en una lista literal []:

>>> r = range(10) 
>>> l = [*r] 
>>> print(l) 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

Aunque esto es equivalente a list(r), es la sintaxis literal y el hecho de que ninguna llamada de función está involucrado hace que se ejecute más rápido. También es menos personajes, si necesita codificar el golf :-)

+2

Para ser claro, puede alinearlo en una sola línea: '[* rango (10)]' funciona bien para cuando no necesita el 'rango' para ningún propósito sino inicializando la 'lista'. Nota al margen: Mi parte favorita (está bien, no realmente) de las generalizaciones de desempaquetado es que los 'conjuntos' vacíos ahora tienen una sintaxis literal,' {*()} ', o como yo lo llamo, el operador mono de un solo ojo . ;-) – ShadowRanger

+0

@ShadowRanger así es como pensé originalmente escribirlo. Decidí ser un poco más detallado para no confundir a los nuevos usuarios de Python :-) –

0

De hecho, esta es una retrogradación de Python3 en comparación con Python2. Ciertamente, Python2 que usa range() y xrange() es más conveniente que Python3 que usa list (range()) y range() respectivamente. La razón es porque el diseñador original de Python3 no tiene mucha experiencia, solo consideraron el uso de la función de rango por parte de muchos principiantes para iterar sobre una gran cantidad de elementos donde la memoria y la CPU son ineficientes; pero descuidaron el uso de la función de rango para producir una lista de números. Ahora es demasiado tarde para que ellos ya vuelvan.

Si yo iba a ser el diseñador de python3, voy a:

  1. uso Irange para devolver una secuencia de iterador
  2. uso lrange para devolver una lista de secuencias
  3. gama
  4. uso devuelva una secuencia iterador (si el número de elementos es grande, por ejemplo, rango de (9999999) o una lista de secuencia (si el número de elementos es pequeño, por ejemplo, rango de (10))

que deben ser óptima.

Cuestiones relacionadas