J'ai des données dans une liste de listes ou une liste de tuples, comme ceci:
data = [[1,2,3], [4,5,6], [7,8,9]]
data = [(1,2,3), (4,5,6), (7,8,9)]
Et je veux trier par le 2ème élément du sous-ensemble. Signification, tri par 2,5,8 d'où 2
vient (1,2,3)
, 5
vient de (4,5,6)
. Quelle est la manière la plus courante de procéder? Dois-je stocker des tuples ou des listes dans ma liste?
Réponses:
ou:
la source
key=itemgetter(1)
et au début du fichier:from operator import itemgetter
sort
voici une méthode d'List
objet de Python, qui reçoit une fonction lambda commekey
paramètre. Vous pouvez le nommer commetup
, out
, ou ce que vous voulez et cela fonctionnera toujours.tup
spécifie ici l'index du tuple de la liste, ce1
qui signifie que le tri sera effectué par les secondes valeurs des tuples de la liste d'origine (2, 5, 8
).lambda
approche intuitive comme plus simple que laitemgetter
classe non intuitive ,itemgetter
elle semble en effet être plus rapide . Je suis curieux de savoir pourquoi c'est. Ma grossière suspicion est que alambda
entraîne le coût caché de la capture de toutes les variables locales dans un contexte de fermeture, contrairement à uneitemgetter
instance. tl; dr: Toujours utiliseritemgetter
, car la vitesse gagne.la source
itemgetter
lambda
data.sort(key=itemgetter(3,1))
Je veux juste ajouter à la réponse de Stephen si vous voulez trier le tableau de haut en bas, une autre manière que dans les commentaires ci-dessus consiste simplement à ajouter ceci à la ligne:
et le résultat sera le suivant:
la source
Pour trier selon plusieurs critères, à savoir par exemple par les deuxième et troisième éléments d'un tuple, laissez
et ainsi définir un lambda qui renvoie un tuple qui décrit la priorité, par exemple
la source
La réponse de Stephen est celle que j'utiliserais. Pour être complet, voici le modèle DSU (décorer-trier-décorer) avec des listes de compréhension:
Ou, plus laconiquement:
Comme indiqué dans le HowTo de tri Python , cela n'a pas été nécessaire depuis Python 2.4, lorsque les fonctions clés sont devenues disponibles.
la source
Afin de trier une liste de tuples
(<word>, <count>)
,count
par ordre décroissant etword
par ordre alphabétique:J'utilise cette méthode:
et ça me donne le résultat:
la source
Sans lambda:
la source
itemgetter()
est un peu plus rapide quelambda tup: tup[1]
, mais l'augmentation est relativement modeste (environ 10 à 25 pour cent).(Session IPython)
la source
La réponse de @Stephen est au point! Voici un exemple pour une meilleure visualisation,
Bravo aux fans de Ready Player One! =)
key
est une fonction qui sera appelée pour transformer les éléments de la collection à des fins de comparaison .. comme lacompareTo
méthode en Java.Le paramètre passé à key doit être quelque chose qui peut être appelé. Ici, l'utilisation de
lambda
crée une fonction anonyme (qui est appelable).La syntaxe de lambda est le mot lambda suivi d'un nom itérable puis d'un seul bloc de code.
Dans l'exemple ci-dessous, nous trions une liste de tuple contenant les informations sur l'heure de certains événements et noms d'acteurs.
Nous trions cette liste par heure d'occurrence de l'événement - qui est le 0ème élément d'un tuple.
Remarque -
s.sort([cmp[, key[, reverse]]])
trie les éléments de s en placela source
Le tri d'un tuple est assez simple:
la source