2010-12-12 37 views
1

je me demandais s'il y avait un moyen simple autour de tri tuples dans les listes en Python, par exemple, si j'ai une liste:tri tuples dans les listes en python

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

et je triai, j'obtiendraient:

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

ou même:

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

si c'est plus facile

Thanx à l'avance :)

+1

btw. c'est un tuple de listes, pas l'inverse. –

+0

Ce qui veut dire: vous n'avez pas de tuples dans une liste ici. Vous avez des listes dans un tuple. '[]' entoure une liste. '()' entoure un tuple. –

Répondre

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

aussi simple que ça ...

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

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

Vous pouvez utiliser un générateur à la place:

>>> 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']) 

La carte est plus rapide, 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: le tri en place est encore plus rapide (merci Karl):

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

Le tri sur place n'a pas besoin de créer un nouveau tuple. Encore plus rapide dans mes tests (bien qu'il crée une nouvelle liste, il ne la remplit pas): '[item.sort() pour item dans list01 if False]' - pour environ 0,45 us par boucle. ;) Sur mon système, la version de 'map' est légèrement plus lente et la version' triée' est beaucoup plus rapide, de sorte qu'il n'y a qu'une différence de vitesse de 40% au lieu de 95% ou plus. –

+0

Et, bien sûr, l'utilisation de l'affreux 'if 0' au lieu de' if False' se rase un peu plus, parce que le nom 'False' ne doit pas être recherché. Alors ouais, c'est comme ça que vous micro-optimisez en Python (mais si c'est si important, pourquoi ne descendez-vous pas en C?). –

+0

J'essayais juste de montrer quelques exemples, ça dépend toujours des données. S'il y en a peu que j'utiliserais le plus court/le plus joli/le plus lisible, s'il y en a beaucoup, j'utiliserais probablement Cython;) –