0 votes

Tri d'un tuple contenant des listes

J'ai une question similaire à celui-ci mais à la place, mon tuple contient des listes, comme suit :

mytuple = (
 ["tomato", 3],
 ["say", 2],
 ["say", 5],
 ["I", 4],
 ["you", 1],
 ["tomato", 6],
)

Quel est le moyen le plus efficace de trier ces données ?

7voto

Joe Beda Points 1500

Il est assez facile d'obtenir un tuple trié :

>>> sorted(mytuple)
[['I', 4], ['say', 2], ['say', 5], ['tomato', 3], ['tomato', 6], ['you', 1]]

Le tri s'effectue sur la base des éléments de la liste. Si les deux premiers éléments correspondent, il compare le deuxième, etc.

Si vous avez d'autres critères, vous pouvez prévoir une fonction de comparaison.

Mise à jour : Comme l'a fait remarquer un commentateur, le système renvoie une liste. Vous pouvez obtenir un autre tuple comme suit :

>>> tuple(sorted(mytuple))
(['I', 4], ['say', 2], ['say', 5], ['tomato', 3], ['tomato', 6], ['you', 1])

5voto

mluebke Points 2588

Il n'est pas possible de trier un tuple.

Ce que vous pouvez faire, c'est utiliser trié() qui ne triera pas le tuple, mais créera une liste triée à partir de votre tuple. Si vous avez vraiment besoin d'un n-uplet trié, vous pouvez alors transformer le retour de sorted en n-uplet :

mytuple = tuple(sorted(mytuple, key=lambda row: row[1]))

Cela peut constituer un gaspillage de mémoire puisque vous créez une liste et la rejetez ensuite (et rejetez également le tuple d'origine). Il y a de fortes chances que vous n'ayez pas besoin d'un tuple. Il serait beaucoup plus efficace de commencer par une liste et de la trier.

1voto

IfLoop Points 59461

Malheureusement, vous devrez instancier un nouveau tuple : quelque chose comme

mytuple = sorted(mytuple)

devrait faire l'affaire. sorted ne renverra pas un tuple, cependant. Envelopper l'appel en tuple() si vous en avez besoin. Cela peut s'avérer coûteux si l'ensemble des données est long.

Si vous devez définir le deuxième élément des sous-listes, vous pouvez utiliser la méthode key au paramètre sorted fonction. Vous aurez besoin d'une fonction d'aide pour cela :

mytuple = sorted(mytuple, key=lambda row: row[1])

1voto

Ben Blank Points 21786

La technique utilisée dans la réponse acceptée à cette question ( sorted(..., key=itemgetter(...)) ) devrait fonctionner avec n'importe quel itérable de ce type. Sur la base des données que vous présentez ici, je pense que la solution exacte présentée ici est celle que vous souhaitez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X