2010-09-25 3 views
11

ho voluto fare qualcosa di simile, ma questa lista codice di ritorno di None (credo che sia perché list.reverse() sta invertendo l'elenco sul posto):perché non riesco a invertire una lista di lista in Python

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

ho provato questo uno, ma il invertito restituire un iteratore:

map(reversed, figure) 

finalmente ho fatto qualcosa di simile, che lavorano per me, ma non so se è la soluzione giusta:

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

map(reverse, figure) 

se qualcuno ha una soluzione migliore che io non sono a conoscenza di fatemelo sapere

saluti,

risposta

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

È inoltre possibile utilizzare una fetta per ottenere l'inversione di un singolo lista (non sul posto):

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

Quindi qualcosa di simile:

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

... o ...

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

... sarà fare quello che vuoi.

27

Il mutatore metodi di contenitori mutabili di Python (come il metodo di liste .reverse) quasi invariabilmente restituire None - alcuni ritorno un valore utile, ad esempio il metodo .pop restituisce l'elemento popped, ma il concetto chiave da mantenere è che nessuno di questi mutatori restituisce il contenitore mutato: piuttosto, il contenitore muta sul posto e il valore restituito del metodo mutatore è non tale contenitore. (Questa è un'applicazione del principio di design CQS - non del tutto fanatica come, ad esempio, in Eiffel, il linguaggio ideato da Bertrand Meyer, che ha anche inventato CQS, ma solo perché in Python "praticità batte purezza, cfr import this; . -)

costruire una lista è spesso più costoso di una semplice costruzione di un iteratore, per il caso in modo schiacciante comune in cui tutto quello che vogliamo fare è ciclo sul risultato, pertanto, built-in, come reversed (e tutto il meravigliosi elementi costitutivi nel modulo itertools) iteratori di ritorno, non elenchi.

Ma cosa succede se si dispone di un n iteratore x ma veramente veramente bisogno dell'equivalente lista ? Pezzo di torta - basta fare y = list(x). Per creare una nuova istanza di tipo list, è chiamare tipo list - questa è un'idea generale di Python che è ancora più cruciale da mantenere rispetto alle cose piuttosto importanti che ho sottolineato nei primi due paragrafi!-)

Quindi, il codice per il vostro problema specifico è davvero molto facile da mettere insieme in base alle nozioni cruciali nei paragrafi precedenti:

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

Nota che sto usando una lista di comprensione, non map: come regola generale, map dovrebbe essere usato solo come ottimizzazione ultimo disperato quando non c'è alcuna necessità di un lambda per costruirlo (se un lambda è coinvolto poi un listcomp, oltre ad essere più chiaro come al solito , tende anche ad essere più veloce comunque! -).

Una volta che sei un "maestro passato di Python", se il profiling ti dice che questo codice è un collo di bottiglia, si può quindi sapere per provare alternative come

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

applicando un affettare negativo-step (aka "Martian Smiley") per fare copie invertite delle righe, sapendo che di solito è più veloce dell'approccio list(reversed(row)). Ma - a meno che il tuo codice non sia mantenuto solo da te o qualcuno altrettanto abile in Python - è una posizione difendibile usare il più semplice approccio "codice dai primi principi" eccetto dove la profilatura ti dice di spingere sul pedale . (Personalmente ritengo che il "Martian Smiley" sia abbastanza importante da evitare di applicare questa buona filosofia generale a questo specifico caso d'uso, ma, hey, le persone ragionevoli potrebbero differire su questo punto molto specifico! -).

+0

+1 per superare il pregiudizio personale :: - 1 – intuited

+3

+1 per "Faccina Marziana" –

0

Si può anche semplicemente fare

for row in figure: 
    row.reverse() 

per cambiare ogni riga al suo posto.