2010-12-12 11 views
1

ich mich gefragt, ob es eine einfache Art und Weise war um Tupel in Listen in Python, zum Beispiel das Sortieren, wenn ich eine Liste haben:sortieren Tupel in Listen in Python

list01 = ([a,b,c],[b,a,d],[d,e,c],[a,f,d]) 

und i sortiert es, würde ich erhalten:

([a,b,c],[a,b,d],[c,d,e],[a,d,f])? 

oder sogar:

([a,b,c],[a,b,d],[a,d,f],[c,d,e]) 

wenn das einfacher ist,

Danke im Voraus :)

+1

Btw. Es ist ein Tupel von Listen, nicht umgekehrt. –

+0

Das heißt: Sie haben hier keine Tupel in einer Liste. Sie haben Listen in einem Tupel. '[]' umgibt eine Liste. '()' umgeben ein Tupel. –

Antwort

6
>>> list01 = (['a','b','c'],['b','a','d'],['d','e','c'],['a','f','d']) 
>>> map(sorted, list01) 
[['a', 'b', 'c'], ['a', 'b', 'd'], ['c', 'd', 'e'], ['a', 'd', 'f']] 
>>> sorted(map(sorted, list01)) 
[['a', 'b', 'c'], ['a', 'b', 'd'], ['a', 'd', 'f'], ['c', 'd', 'e']] 
2

So einfach ist das ...

list01 = (['a','b','c'],['b','a','d'],['d','e','c'],['a','f','d']) 

print(sorted(map(sorted,list01))) 
2

können Sie einen Generator statt:

>>> list01 = (['a','b','c'],['b','a','d'],['d','e','c'],['a','f','d']) 
>>> tuple((sorted(item) for item in list01)) 
(['a', 'b', 'c'], ['a', 'b', 'd'], ['c', 'd', 'e'], ['a', 'd', 'f']) 

Map schneller ist, btw. ;)

In [48]: timeit tuple(map(sorted, list01)) 
100000 loops, best of 3: 3.71 us per loop 

In [49]: timeit tuple((sorted(item) for item in list01)) 
100000 loops, best of 3: 7.26 us per loop 

Edit: an Ort und Stelle ist die Sortierung noch schneller (dank Karl):

In [120]: timeit [item.sort() for item in list01 if False] 
1000000 loops, best of 3: 490 ns per loop 
+0

Beim Sortieren an Ort und Stelle muss kein neues Tupel erstellt werden. Noch schneller in meinen Tests (obwohl es eine neue Liste erstellt, füllt es sie nicht auf): '[item.sort() für Element in list01 wenn False]' - für ungefähr 0,45 us pro Schleife. ;) Auf meinem System ist die 'map'-Version etwas langsamer und die' sortierte' Version ist wesentlich schneller, so dass es dort nur etwa 40% Geschwindigkeitsunterschied gibt anstatt der 95%, die du berichtest. –

+0

Und natürlich wird das hässliche 'if 0' anstelle von' ifFalse' etwas mehr abgeschert, weil der Name 'False' nicht gesucht werden muss. Also ja, das ist die Art und Weise, wie Sie in Python eine Mikrooptimierung vornehmen (aber wenn es so wichtig ist, warum werfen Sie nicht auf C?). –

+0

Ich habe nur versucht, einige Beispiele zu zeigen, es hängt immer noch von Daten ab. Wenn es nur wenige von ihnen gibt, würde ich die kürzeste/schönere/am besten lesbare verwenden, wenn es viele davon gibt, würde ich wahrscheinlich Cython verwenden;) –

Verwandte Themen