Tri d'une liste Python de deux domaines
J'ai la liste suivante créé à partir d'une triés csv
list1 = sorted(csv1, key=operator.itemgetter(1))
Je fait comme pour trier la liste par deux critères: d'abord par la valeur dans la zone 1, puis par la valeur dans le champ 2. Comment puis-je faire cela?
- Double Possible de Trier une liste par plusieurs attributs?
- Ne nous laissons cette question stand et juste à en restreindre la portée de "liste-des-listes-de-longueur-deux-builtin-types (par exemple string/int/float)". Ou ne nous permettent également de "liste-des-défini par l'utilisateur-objet", comme le suggère le titre est également autorisé, dans ce cas la réponse est "Définir
__lt__()
méthode sur votre classe ou d'hériter d'une classe qui n'"? Que ferait un bien meilleur canonique.
Vous devez vous connecter pour publier un commentaire.
comme ceci:
operator
est un module qui doit être importé.Répondre à cette mort thread pour l'archivage.
Pas besoin d'importer quoi que ce soit lors de l'utilisation de lambda fonctions.
Ce type
list
par le premier élément, puis par le deuxième élément.lambda x: (x[0],int(x[1]))
. +1x[1]
est la date? Dois-je le convertir en entier aussi? @pbible effectue la conversion de string en int préserver l'ordre alphabétique de la chaîne?print("a"<"b")
imprimeTrue
.-
dans-x[1]
stand for?Python a un tri stable, donc à condition que la performance n'est pas un problème, le plus simple est de faire le tri par le champ 2 et ensuite de les trier à nouveau par le champ 1.
Qui vous donnera le résultat que vous voulez, le seul hic, c'est que si c'est une grande liste (ou que vous voulez trier souvent) l'appel de trier par deux fois peut-être inacceptable pour les frais généraux.
Cette façon de faire permet également de gérer la situation où vous souhaitez que certaines colonnes inverse triés, il suffit d'inclure le "reverse=True' paramètre si nécessaire.
Sinon, vous pouvez passer plusieurs paramètres à itemgetter ou créer manuellement un n-uplet. Qui va probablement être plus rapide, mais le problème est qu'il n'a pas généraliser bien si certaines colonnes voulez être inversée triés (colonnes numériques peuvent encore être inversée, en niant, mais qui s'arrête le tri étant stable).
Donc, si vous n'avez pas besoin de toutes les colonnes inverse triés, partir pour de multiples arguments pour itemgetter, si vous pouvez, et les colonnes ne sont pas numériques ou vous veulent garder le tri stable de partir pour de multiples consécutifs sortes.
Edit: Pour les intervenants qui ont des problèmes de compréhension de la façon dont cela répond à la question d'origine, voici un exemple qui montre exactement comment la nature stable de la tri garantit que nous pouvons faire des tris sur chaque touche et jusqu'à la fin avec les données triées en fonction de plusieurs critères:
C'est un exécutable, par exemple, mais pour sauver des personnes exécutant la sortie est:
En particulier de noter que dans la deuxième étape de la
reverse=True
paramètre garde la firstnames dans l'ordre alors que tout simplement le tri, puis l'inversion de la liste perdrait l'ordre souhaité pour la troisième clé de tri.tuple()
peut recevoir deux arguments (ou plutôt trois, si l'on compte avecself
)return
déclaration doit êtrereturn tuple((x[1], x[2]))
ou tout simplementreturn x[1], x[2]
. Consulter @jaap réponse ci-dessous si vous êtes à la recherche pour le tri dans les différentes directionstuple(x[1:3])
, si vous souhaitez utiliser le tuple constructeur pour une raison quelconque au lieu d'un n-uplet de la liste d'affichagex[1], x[2]
. Oukeyfunc = operator.itemgetter(1, 2)
et de ne même pas écrire une fonction pour vous-même.Nous pouvons également l'utiliser .trier avec lambda 2 fois parce que python de tri est en place et stable. Ce sera d'abord le tri de la liste selon le deuxième élément, x[1]. Ensuite, il va trier le premier élément, x[0] (priorité la plus élevée).
employés[0] = Nom de l'Employé
les employés[1] = Salaire de l'Employé
C'est l'équivalent de la manière suivante:
des employés.sort(key = lambda x: x[0], x[1]))
Dans l'ordre croissant, vous pouvez utiliser:
ou dans l'ordre décroissant, vous pouvez utiliser:
De tri de la liste des dicts l'aide ci-dessous permettra de trier la liste dans l'ordre décroissant dans la première colonne comme un salaire et de la deuxième colonne que l'âge
De sortie: [{'salaire': 123, "age": 25}, {'salaire': 123, 'age': 23}]