Estoy tratando de hacer una lista con números 1-1000
. Obviamente, esto sería molesto para escribir / leer, así que estoy tratando de hacer una lista con un rango. En Python 2 parece que:
some_list = range(1,1000)
hubiera funcionado, pero en Python 3 el rango es similar al xrange
de Python 2?
¿Alguien puede dar alguna idea de esto?
python
python-3.x
list
range
Cobertizo
fuente
fuente
some_list[i] == i+1
entonces probablemente no necesites una lista de todos modos.Respuestas:
Simplemente puede construir una lista desde el objeto de rango:
Así es como lo haces con generadores en python2.x también. Por lo general, probablemente no necesite una lista, ya que puede obtener el valor de
my_list[i]
más eficientemente (i + 1
), y si solo necesita iterar sobre ella, simplemente puede recurrir a ellarange
.También tenga en cuenta que en python2.x,
xrange
todavía es indexable 1 . Esto significa querange
en python3.x también tiene la misma propiedad 21
print xrange(30)[12]
funciona para python2.x2 La declaración análoga a 1 en python3.x es
print(range(30)[12])
y también funciona.fuente
list(arg)
se entiende en otros idiomas como llamar a un constructor de lalist
clase. En realidad, también es el caso de Python. Los debates sobre si el objeto se llena durante la construcción (como en el caso de C ++) o solo durante el primer método llamado automáticamente (como en el__init__()
método Python ) no pueden cambiar la idea abstracta básica. Mi opinión es que el constructor de la lista toma el iterador y llena la lista con los valores devueltos .'range' object is not callable
En Pythons <= 3.4 puede, como otros sugirieron, usar
list(range(10))
para hacer una lista fuera de un rango (en general, cualquier iterable).Otra alternativa, introducida en Python
3.5
con sus generalizaciones de desempaquetado, es usar*
en una lista literal[]
:Aunque esto es equivalente a
list(r)
, es una sintaxis literal y el hecho de que no esté involucrada ninguna llamada a la función le permite ejecutarse más rápido. También tiene menos caracteres, si necesita codificar golf :-)fuente
[*range(10)]
funciona bien para cuando no necesita elrange
para ningún propósito que no sea la inicializaciónlist
. Nota al margen: mi parte favorita (está bien, en realidad no) de las generalizaciones de desempaquetado es que losset
s vacíos ahora tienen una sintaxis literal{*()}
o, como lo llamo, el operador mono de un solo ojo. ;-)en Python 3.x, la
range()
función tiene su propio tipo. así que en este caso debes usar iteradorlist(range(1000))
fuente
list(range(1000))()
La razón por la cual Python3 carece de una función para obtener directamente una lista a distancia es porque el diseñador original de Python3 era bastante novato en Python2. Solo consideró el uso de la
range()
función en un bucle for, por lo tanto, la lista nunca debería necesitar expandirse. De hecho, muy a menudo necesitamos usar larange()
función para producir una lista y pasarla a una función.Por lo tanto, en este caso, Python3 es menos conveniente en comparación con Python2 porque:
xrange()
yrange()
;range()
ylist(range())
No obstante, aún puede usar la expansión de lista de esta manera:
fuente
list
, porque eso generalmente es lo incorrecto. Para 99 de cada 100 casos de uso, hacer un reallist
es ineficiente y sin sentido, ya que enrange
sí mismo actúa como una secuencia inmutable en casi todos los sentidos, a veces más eficientemente para arrancar (por ejemplo, pruebas de contención paraint
s areO(1)
, vs.O(n)
forlist
s). En Python 2, la gente solía usarrange
de forma predeterminada, aunquexrange
casi siempre era la mejor opción; en Python 3, puede optar explícitamente por ellist
, no obtenerlo por accidente usando el nombre incorrecto.Realmente no debería necesitar usar los números 1-1000 en una lista. Pero si por alguna razón realmente necesita estos números, entonces podría hacer:
Lista de comprensión en pocas palabras:
La comprensión de la lista anterior se traduce en:
Esta es solo la sintaxis de comprensión de la lista, aunque de 2.x. Sé que esto funcionará en Python 3, pero no estoy seguro de si también hay una sintaxis actualizada
El rango comienza incluyendo el primer parámetro; pero termina Hasta, sin incluir el segundo parámetro (cuando se proporcionan 2 parámetros; si el primer parámetro se deja, comenzará en '0')
fuente
list(range(1000))
list()
constructor con un iterable . Ellist()
constructor sabe cómo crear una nueva lista cuando se le da un objeto iterable.list(range(1000))
funcionará en python3 al igual quelist(xrange(1000))
en python2En realidad, si desea 1-1000 (inclusive), use la
range(...)
función con los parámetros 1 y 1001:range(1, 1001)
porque larange(start, end)
función va de inicio a (fin-1), inclusive.fuente
Use Range en Python 3.
Aquí hay una función de ejemplo que regresa entre números de dos números
fuente
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 que 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, ya es demasiado tarde para que vuelvan a cambiar.
Si fuera el diseñador de Python3, haría lo siguiente:
Eso debería ser óptimo.
fuente