2011-11-02 1 views
4

Exemple:
A partir de cette liste:
Quel serait le moyen le plus efficace/propre de trier en profondeur une liste multidimensionnelle en Python?

list = [[10, 9, 1], [2, 1, 1,], [4, 11, 16]] 

Je voudrais avoir:

print list 
[[1, 1, 1], [2, 4, 9], [10, 11, 16]] 

Est-il possible avec le list.sort() fonction ou dois-je écrire une boucle personnalisée?

+1

Êtes-vous sûr de ce que vous voulez est '[[1, 1, 1], [2, 4, 9], [10, 11, 16]]' et non '[[2, 1, 1 ], [4, 11, 16], [10, 9, 1]] »comme Max le suggère? –

+0

ups)) J'ai totalement mal compris la question. voté pour supprimer ma réponse. – Max

+0

Oui, je voudrais trier les valeurs, pas les listes imbriquées. – Joucks

Répondre

1

Voici un exemple d'aplatissement, le tri, puis de reconstruire les listes imbriquées, comme @Inerdia suggéré dans les commentaires ci-dessus.

J'ai essayé d'utiliser des générateurs et des itérateurs lorsque cela était possible, mais je suis sûr qu'il existe des façons plus intelligentes et plus efficaces d'obtenir le résultat!

from itertools import izip 

l = [[10, 9, 1], [2, 1, 1,], [4, 11, 16]] 
# flatten the list and sort it 
f = sorted(inner for outer in l for inner in outer) 
# group it into 3s again using izip 
new_list = [list(l) for l in izip(*[iter(f)]*3)] 
+0

Semble parfait pour moi, merci – Joucks

0
>>> l = [[10, 9, 1], [2, 1, 1,], [4, 11, 16]] 
>>> L = sorted([sub[i] for sub in l for i in range(3)]) 
>>> print L 
[1, 1, 1, 2, 4, 9, 10, 11, 16] 

Maintenant, vous pouvez regrouper L en groupes de 3

+0

Je pense que vous voulez dire L = trié ([sub [i] pour sub dans l dans la gamme (3)]) Merci, cela fera l'affaire je suppose – Joucks

+0

Oui, désolé. Déjà mis à jour –

Questions connexes