2011-09-02 20 views

Respuesta

361

uso reversed() función:

reversed(range(10)) 

Es mucho más significativa.

Actualización:

Si quieren que sea una lista (como Btk señaló):

list(reversed(range(10))) 

Actualización:

Si desea utilizar sólo range para lograr el mismo resultado, puede usar todos sus parámetros. range(start, stop, step)

Por ejemplo, para generar una lista [5,4,3,2,1,0], puede utilizar los siguientes:

range(5, -1, -1) 

puede ser menos intuitiva pero a medida que las observaciones se señala, esto es más eficiente y el derecho de uso de la gama de revertido lista.

+12

Aunque es "menos eficiente". Y no puedes hacer operaciones de corte en él. –

+4

@Jakob. Buen punto. +1. Todos aprendemos unos de otros todos los días ... :-) –

+3

Esto también produciría una lista de 8 a 0, en lugar de 9 a 0. –

279

Utilice la función incorporada 'rango'. La firma es range(start, stop, step). Esto produce una secuencia que produce números, comenzando con start, y terminando si se ha alcanzado stop, excluyendo stop.

>>> range(9,-1,-1) 
    [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] 
>>> range(-2, 6, 2) 
    [-2, 0, 2, 4] 

En Python 3, esto produce un objeto no lista range, que funciona efectivamente como una lista de sólo lectura (pero utiliza manera menos memoria, en particular para grandes rangos).

+1

¿Puede explicarme esto también, también me puede recomendar cualquier sitio web/libro de pdf para python –

+8

@ramesh Si ejecuta 'help (range)' en un shell de python le dirá los argumentos. Son el número para comenzar, el número para finalizar (exclusivo) y el paso a seguir, por lo que comienza en 9 y resta 1 hasta que llega a -1 (en ese punto se detiene sin regresar, razón por la cual el rango finaliza en 0) –

+3

@ ramesh.mimit: Simplemente vaya al sitio oficial de Python. Allí hay documentación completa, incluyendo un gran tutorial. –

1
range(9,0,-1) 
[9, 8, 7, 6, 5, 4, 3, 2, 1] 
+12

Su respuesta muestra por qué 'revertido (rango (10))' es menos propenso a errores. Sin ofender a Asinox. Solo una observación honesta. –

+0

No sé si es estándar dejar en pantalla respuestas erróneas. ¿Puedo o alguien corregirlo o incluso eliminarlo? – sinekonata

+2

@sine, no solo déjalo y pregúntate cómo se acumularon 3 votaciones ascendentes ... Supongo que podrías marcarlo para llamar la atención del moderador (duplicado de [respuesta] (http://stackoverflow.com/a/7286366/2742805) de 18 meses antes, excepto roto), no estoy seguro de si lo eliminarían o no. – OGHaza

33

Usted podría utilizar range(10)[::-1] que es lo mismo que range(9, -1, -1) y podría decirse que sea más legible (si está familiarizado con el lenguaje común sequence[::-1] Python).

-1
range(9,-1,-1) 
    [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] 

Tiene la forma correcta. Si utiliza

reversed(range(10)) 

no obtendrá un caso 0. Por ejemplo, supongamos que tu 10 no es un número mágico y una variable que estás usando para buscar comenzar desde el reverso. Si su n caso es 0, al revés (rango (0)) no se ejecutará, lo que es incorrecto si por casualidad tiene un solo objeto en el índice cero.

5

El requisito en esta pregunta requiere un list de números enteros de tamaño 10 en orden descendente . Entonces, produzcamos una lista en python.

# This meets the requirement. 
# But it is a bit harder to wrap one's head around this. right? 
>>> range(10-1, -1, -1) 
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0] 

# let's find something that is a bit more self-explanatory. Sounds good? 
# ---------------------------------------------------- 

# This returns a list in ascending order. 
# Opposite of what the requirement called for. 
>>> range(10) 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

# This returns an iterator in descending order. 
# Doesn't meet the requirement as it is not a list. 
>>> reversed(range(10)) 
<listreverseiterator object at 0x10e14e090> 

# This returns a list in descending order and meets the requirement 
>>> list(reversed(range(10))) 
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0] 
+2

Me gusta mucho el ** triple '-1' ** Es exactamente * este patrón * lo que hace que sea fácil mantener *' envuelto en esto' * - Hoy aprendí que si realmente * tiene que ser eficiente * , use 'range (n-1, -1, -1)' al atravesar un rango en orden inverso. – Wolf

0

usando sin [:: - 1] o invertidas -

def reverse(text): 
    result = [] 
    for index in range(len(text)-1,-1,-1): 
     c = text[index] 
     result.append(c) 
    return ''.join(result) 

print reverse("python!") 
+4

¿Por qué alguien debería escribir esto en lugar de '" python! "[:: - 1]'? – Daniel

0
[9-i for i in range(10)] 
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0] 
2

creo que esto puede ayudar,

range(5)[::-1] 

a continuación es Uso:

for i in range(5)[::-1]: 
    print i 
6

La legibilidad a un lado, reversed(range(n)) parece ser más rápido que range(n)[::-1].

$ python -m timeit "reversed(range(1000000000))" 
1000000 loops, best of 3: 0.598 usec per loop 
$ python -m timeit "range(1000000000)[::-1]" 
1000000 loops, best of 3: 0.945 usec per loop 

Sólo si alguien se preguntaba :)

+0

es bueno tener algunos números :) - ¿por qué no agregaste 'range (1000000000-1, -1, -1)' también? – Wolf

+0

... mejor no intente 'timeit range (1000000000-1, -1, -1)' en la línea de comandos, en su lugar vea [mis resultados] (https://stackoverflow.com/a/44519681/2932052) :-) – Wolf

8
for i in range(8, 0, -1) 

va a resolver este problema. Saldrá de 8 a 1, y -1 significa una lista invertida

5

No tiene sentido utilizar reverse como método de rango puede devolver la lista invertida.

Cuando se tiene iteración sobre n artículos y desea reemplazar el orden de la lista devuelta por range(start, stop, step) usted tiene que utilizar tercer parámetro del rango que identifica step y ponerlo a -1, otros parámetros deberán ajustarse en consecuencia:

  1. Proporcionar parada parámetro como -1 (el mismo de valor anterior de stop - 1, stop era igual a 0).
  2. Como parámetro de inicio use n-1.

Así equivalente de rango (n) en orden inverso sería:

n = 10 
print range(n-1,-1,-1) 
#[9, 8, 7, 6, 5, 4, 3, 2, 1, 0] 
+2

Francamente me parece menos intuitivo que 'revertido (rango (n))' –

+1

@NicholasHamilton Estoy de acuerdo con usted, sin embargo, la idea detrás de esa respuesta es utilizar menos recursos ... (y la pregunta era sobre el uso de la función solo rango :)) –

+0

Ok, sin preocupaciones, supongo que depende de la situación. Por ejemplo, si la función de rango se usa como índice para un bucle, tendrá un efecto limitado, sin embargo, si se usa dentro de un bucle externo, entonces el costo se compondrá ... –

0

Usted no necesariamente tiene que utilizar la función de rango, puede simplemente hacer la lista [:: - 1], que debe devolver la lista en orden inverso rápidamente, sin usar ninguna adición.

+0

Esta parece ser la solución sugerida en una [respuesta anterior] (http://stackoverflow.com/a/21714738/1072229). También parece que podrías estar tratando de comentar una respuesta anterior diferente; necesitarás obtener un poco más de reputación antes de poder hacer eso. –

1

Puede hacer la impresión de los números temporales de gama() Al igual que el BIF,

for number in range (10 , 0 , -1) : 
    print (number) 

salida será [10,9,8,7,6,5,4,3,2,1]

gama() - gama (inicio, final, incremento/decremento) donde inicio es inclusivo, al final es exclusiva y el incremento puede ser cualquier número y se comporta como paso

3

Para aquellos que estén interesados ​​en la "eficiencia "de las opciones recogidas hasta ahora ...

Jaime RGP's answer me llevó a reiniciar el equipo después detiempo la solución un tanto "difícil" de Jason, literalmente, siguiendo mi propia sugerencia (a través de comentario). Para preservar a la curiosidad de que el tiempo de inactividad, que presento aquí mis resultados (el peor de los primero):

Jason's answer (tal vez sólo una excursión en el poder de list comprehension):

$ python -m timeit "[9-i for i in range(10)]" 
1000000 loops, best of 3: 1.54 usec per loop 

martineau's answer (legible si está familiarizados con el extended slices syntax):

$ python -m timeit "range(10)[::-1]" 
1000000 loops, best of 3: 0.743 usec per loop 

Michał Šrajer's answer (la aceptada uno, muy legible):

$ python -m timeit "reversed(range(10))" 
1000000 loops, best of 3: 0.538 usec per loop 

bene's answer (la primera, pero muy mediocre at that time):

$ python -m timeit "range(9,-1,-1)" 
1000000 loops, best of 3: 0.401 usec per loop 

La última opción es fácil de recordar usando la notación range(n-1,-1,-1) por Val Neekman.

0

Supongamos que tiene una lista llámelo a = {1,2,3,4,5} Ahora, si desea imprimir la lista en reversa, simplemente utilice el siguiente código.

a.reverse 
for i in a: 
    print(i) 

Sé que ha preguntado utilizando el rango, pero ya ha sido respondido.

Cuestiones relacionadas