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 xrangede Python 2?
¿Alguien puede dar alguna idea de esto?
python
python-3.x
list
range
Cobertizo
fuente
fuente

some_list[i] == i+1entonces 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,
xrangetodavía es indexable 1 . Esto significa querangeen 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 lalistclase. 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 callableEn 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.5con 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 elrangepara 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 lossets 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 reallistes ineficiente y sin sentido, ya que enrangesí 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 paraints areO(1), vs.O(n)forlists). En Python 2, la gente solía usarrangede forma predeterminada, aunquexrangecasi 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