2012-11-14 5 views
8

Ich habe ein Tupel/Liste in einer Liste wie folgt aus:Swap-Werte in einem Tupel/Liste in einer Liste in Python?

[('foo','bar'),('foo1','bar1'),('foofoo','barbar')] 

Was ist der schnellste Weg in Python (auf einem sehr niedrigen CPU/RAM-Maschine ausgeführt wird) Werte wie diese zu tauschen ...

[('bar','foo'),('bar1','foo1'),('barbar','foofoo')] 

curently mit:

for x in mylist: 
    self.maynewlist.append((_(x[1]),(x[0]))) 

gibt es einen besseren oder schnelleren Weg ???

Antwort

7

könnten Sie Karte verwenden:

map (lambda t: (t[1], t[0]), mylist) 

Oder Liste Verständnis:

[(t[1], t[0]) for t in mylist] 

Liste Comprehensions bevorzugt und angeblich viel schneller als Karte, wenn Lambda benötigt wird, beachten Sie jedoch, dass die Liste Verständnis hat eine strenge Bewertung, das heißt, es wird ausgewertet werden, sobald es an Variable gebunden wird, wenn Sie sich Sorgen über Speicherverbrauch machen, verwenden Sie stattdessen einen Generator:

g = ((t[1], t[0]) for t in mylist) 
#call when you need a value 
g.next() 

Es gibt einige weitere Details hier: Python List Comprehension Vs. Map

+0

Die Sache ist, dass ich diese invertierte Liste für eine enigma2 GUI-Komponente brauche, was bedeutet, dass ich eine vollständige Liste (mehr als 1000 Tupel in dieser Liste) invertiert brauche. Listenverständnis ist dann der richtige Weg? – subixonfire

+0

@ user1824571 höchstwahrscheinlich – iabdalkader

5

Sie reversed wie diese verwenden:

tuple(reversed((1, 2)) == (2, 1) 

Um es auf eine Liste anwenden, Sie map oder eine Liste Verständnis verwenden können:

map(tuple, map(reversed, tuples))  # map 
[tuple(reversed(x)) for x in tuples] # list comprehension 

Wenn Sie in erster Linie in Laufzeitgeschwindigkeit interessiert sind, kann ich nur empfehlen nd, dass Sie die verschiedenen Ansätze profilieren und den schnellsten auswählen.