2010-09-25 13 views
11

lo que quería hacer algo como esto, pero esta lista de regreso código de Ninguno (creo que es porque list.reverse() está revirtiendo la lista en su lugar):por qué no puedo revertir una lista de lista en Python

map(lambda row: row.reverse(), figure) 

Traté de éste, pero la revertido devuelven un iterador:

map(reversed, figure) 

finalmente hice algo como esto, que el trabajo para mí, pero yo no sé si es la solución correcta:

def reverse(row): 
    """func that reverse a list not in place""" 
    row.reverse() 
    return row 

map(reverse, figure) 

si alguien tiene una mejor solución que no soy consciente de por favor hágamelo saber

un cordial saludo,

Respuesta

1
map(lambda row: list(reversed(row)), figure) 
3
reversed_lists = [list(reversed(x)) for x in figure] 
8

También puede utilizar una rebanada de conseguir la inversión de una sola lista (no en su lugar):

>>> a = [1,2,3,4] 
>>> a[::-1] 
[4, 3, 2, 1] 

Así que algo como:

all_reversed = [lst[::-1] for lst in figure] 

... o ...

all_reversed = map(lambda x: x[::-1], figure) 

... va a hacer lo que quiera.

27

El mutador métodos de contenedores mutables de Python (tales como el método de listas .reverse) casi invariablemente volver None - unos pocos retorno un valor útil, por ejemplo, el método .pop devuelve el elemento reventado, pero el concepto clave para retener es que ninguno de esos mutadores devuelve el contenedor mutado: más bien, el contenedor muta en el lugar y el valor de retorno del método del mutador es que no es ese contenedor. (Esta es una aplicación del principio de diseño CQS, no tan fanático como, por ejemplo, en Eiffel, el lenguaje ideado por Bertrand Meyer, que también inventó CQS, pero eso es solo porque en Python "la practicidad supera a la pureza, cfr import this; . -)

construcción de una lista es a menudo más costosos que sólo la construcción de un iterador, para el caso abrumadoramente común donde lo único que quiere hacer es bucle en el resultado, por lo tanto, muebles empotrados como reversed (y todo el bloques de construcción maravillosos en el módulo itertools) iteradores de retorno, listas.

Pero, ¿y si usted por lo tanto tiene una n iterador x pero realmente necesita la lista equivalente y? Un pedazo de pastel: solo hazlo y = list(x). Para hacer una nueva instancia del tipo list, llame al tipo list - ¡esta es una idea general de Python que es aún más crucial de conservar que las cosas bastante importantes que señalé en los dos primeros párrafos!-)

Por lo tanto, el código para su problema específico es realmente muy fácil de armar basado en las nociones cruciales en los párrafos anteriores:

[list(reversed(row)) for row in figure] 

Tenga en cuenta que estoy usando una lista por comprensión, no map: como regla general, map deberían utilizarse sólo como una optimización de último recurso cuando hay sin necesidad de un lambda para construirlo (si un lambda participa luego un listcomp, además de ser más claros, como de costumbre , también tiende a ser más rápido de todos modos! -).

Una vez que usted es un "maestro en Python", si su perfilado te dice que este código es un cuello de botella, a continuación, puede saber para probar alternativas tales como

[row[::-1] for row in figure] 

aplicar un corte en rodajas a paso negativo (también conocido como "Martian Smiley") para hacer copias invertidas de las filas, sabiendo que generalmente es más rápido que el enfoque list(reversed(row)). Pero, a menos que su código deba ser mantenido solo por usted o por alguien al menos tan hábil en Python, es una posición defendible usar el enfoque más simple de "código de los primeros principios", excepto cuando el perfil le dice que presione el pedal . (Personalmente, creo que el "Smiley marciano" es lo suficientemente importante como para evitar aplicar esta buena filosofía general a este caso de uso específico, pero, ¡oye, las personas razonables podrían diferir en este punto específico! -).

+0

+1 para la superación del sesgo personal :: - 1 – intuited

+3

+1 para "Martian Smiley" –

0

también puede simplemente hacer

for row in figure: 
    row.reverse() 

para cambiar cada fila en su lugar.

Cuestiones relacionadas