J'ai une liste de dictionnaires et je veux que chaque élément soit trié par une valeur de propriété spécifique.
Tenez compte du tableau ci-dessous,
[{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]
Lorsque trié par name
, devrait devenir
[{'name':'Bart', 'age':10}, {'name':'Homer', 'age':39}]
[{'name':'Bart', 'age':10, 'note':3},{'name':'Homer','age':10,'note':2},{'name':'Vasile','age':20,'note':3}]
Et utiliser:from operator import itemgetter newlist = sorted(old_list, key=itemgetter(-'note','name')
EDIT: Testé, et cela fonctionne mais je ne sais pas comment noter DESC et nommer ASC.Réponses:
Cela peut sembler plus propre en utilisant une clé à la place d'un cmp:
ou comme JFSebastian et d'autres l'ont suggéré,
Pour être complet (comme indiqué dans les commentaires de fitzgeraldsteele), ajoutez
reverse=True
pour trier par ordre décroissantla source
itemgetter(i)
oùi
est l'index de l'élément tuple sur lequel effectuer le tri.itemgetter
accepte plus d'un argument:itemgetter(1,2,3)
est une fonction qui retourne un tuple commeobj[1], obj[2], obj[3]
, vous pouvez donc l'utiliser pour faire des tris complexes.Pour trier la liste des dictionnaires par key = 'name':
Pour trier la liste des dictionnaires par clé = 'âge':
la source
key=lambda k: (k['name'], k['age'])
. (oukey=itemgetter('name', 'age')
). les tuplescmp
compareront tour à tour chaque élément. c'est sanglant brillant.key
argument facultatif delist.sort()
n'est pas décrit. Une idée où trouver ça?list
et amis.my_list
sera maintenant ce que vous voulez.(3 ans plus tard) Modifié pour ajouter:
Le nouvel
key
argument est plus efficace et plus net. Une meilleure réponse ressemble maintenant à:... le lambda est, OMI, plus facile à comprendre que
operator.itemgetter
, mais YMMV.la source
Si vous souhaitez trier la liste par plusieurs clés, vous pouvez procéder comme suit:
C'est plutôt hackish, car il repose sur la conversion des valeurs en une seule représentation de chaîne pour la comparaison, mais cela fonctionne comme prévu pour les nombres, y compris les nombres négatifs (bien que vous devrez formater votre chaîne de manière appropriée avec des remplissages zéro si vous utilisez des nombres)
la source
'key' est utilisé pour trier par une valeur arbitraire et 'itemgetter' définit cette valeur à l'attribut 'name' de chaque élément.
la source
la source
Je suppose que vous vouliez dire:
Ce serait trié comme ceci:
la source
Vous pouvez utiliser une fonction de comparaison personnalisée ou passer une fonction qui calcule une clé de tri personnalisée. C'est généralement plus efficace car la clé n'est calculée qu'une fois par article, tandis que la fonction de comparaison serait appelée plusieurs fois.
Vous pouvez le faire de cette façon:
Mais la bibliothèque standard contient une routine générique pour obtenir des éléments d'objets arbitraires:
itemgetter
. Essayez donc ceci à la place:la source
En utilisant la transformation Schwartzian de Perl,
faire
donne
En savoir plus sur la transformation de Perl Schwartzian
la source
key=
for.sort
depuis 2.4, c'est-à-dire l'année 2004, il fait la transformation schwartzienne au sein du code de tri, en C; cette méthode n'est donc utile que sur Pythons 2.0-2.3. qui ont tous plus de 12 ans.Vous devez implémenter votre propre fonction de comparaison qui comparera les dictionnaires par les valeurs des clés de nom. Voir Tri du mini-HOW TO à partir du wiki PythonInfo
la source
nous devons parfois utiliser
lower()
par exemplela source
Voici la solution générale alternative - elle trie les éléments de dict par clés et valeurs. L'avantage - pas besoin de spécifier de clés, et cela fonctionnerait toujours si certaines clés manquaient dans certains dictionnaires.
la source
L'utilisation du package pandas est une autre méthode, bien que son exécution à grande échelle soit beaucoup plus lente que les méthodes plus traditionnelles proposées par d'autres:
Voici quelques valeurs de référence pour une petite liste et une grande liste (100k +) de dictés:
la source
Si vous n'avez pas besoin de l'original
list
dedictionaries
, vous pouvez le modifier sur place avec lasort()
méthode à l'aide d'une fonction de touche personnalisée.Fonction clef:
À
list
trier:Tri sur place:
Si vous avez besoin de l'original
list
, appelez lasorted()
fonction en lui passant lalist
et la fonction clé, puis affectez le retour triélist
à une nouvelle variable:Impression
data_one
etnew_data
.la source
Disons que j'ai un dictionnaire
D
avec des éléments ci-dessous. Pour trier, utilisez simplement l'argument clé trié pour passer la fonction personnalisée comme ci-dessous:Regardez ça .
la source
J'ai été un grand fan du filtre w / lambda mais ce n'est pas la meilleure option si vous considérez la complexité du temps
Première option
Deuxième option
Comparaison rapide des temps d'exécution
la source
Si les performances sont un problème, je les utiliserais
operator.itemgetter
plutôtlambda
que car les fonctions intégrées fonctionnent plus rapidement que les fonctions artisanales. Laitemgetter
fonction semble fonctionner environ 20% plus rapidement quelambda
sur la base de mes tests.Depuis https://wiki.python.org/moin/PythonSpeed :
Voici une comparaison de tri en utilisant la vitesse
lambda
vsitemgetter
.Les deux techniques trient la liste dans le même ordre (vérifiée par l'exécution de l'instruction finale dans le bloc de code) mais l'une est un peu plus rapide.
la source
Vous pouvez utiliser le code suivant
la source