Le tri des listes est courant, mais voici comment trier les dict dans la liste et l'instance dans la liste.
Toutes les sortes sont dans l'ordre croissant.
Utilisez la fonction intégrée sorted
dans sort.
Si vous n'utilisez pas les classes de données standard de la bibliothèque, cela devrait fonctionner comme 3.6
dict in list
Dans le cas de dict in list, il est nécessaire de spécifier l'argument clé de la fonction triée.
Vous pouvez utiliser lambda lors de la spécification de la clé et utiliser lambda x: x ['a']
comme fonction anonyme, mais selon le fonctionnaire, il semble qu'il soit plus rapide d'utiliser le getter d'élément de l'opérateur de bibliothèque standard (je ne l'ai pas vérifié, donc ce n'est rien. Je ne peux pas dire).
https://docs.python.org/ja/3/howto/sorting.html#operator-module-functions
Python fournit des fonctions d'accesseur rapides et faciles à utiliser. Le module opérateur a les fonctions itemgetter (), attrgetter () et methodcaller ().
from operator import itemgetter
person_list = [{'name': 'a', 'age': 4}, {'name': 'b', 'age': 3}, {'name': 'c', 'age': 10}, {'name': 'd', 'age': 2}, {'name': 'e', 'age': 1}]
sorted(person_list, key=itemgetter('age'))
[{'name': 'e', 'age': 1},
{'name': 'd', 'age': 2},
{'name': 'b', 'age': 3},
{'name': 'a', 'age': 4},
{'name': 'c', 'age': 10}]
instance in list
Comme pour dict in list, spécifiez les paramètres à trier dans l'argument clé de la fonction triée. Par exemple, utilisez la lettre attr.
Une fois que vous créez un dict dans la liste avec les sources, puis créez une instance avec la liste (map (...)), il n'y a pas de signification profonde. Je voulais juste faciliter les choses en détournant la liste de personne utilisée dans le dict dans la liste.
from dataclasses import dataclass
from operator import attrgetter
@dataclass
class Person:
name: str
age: int
sources = [{'name': 'a', 'age': 4}, {'name': 'b', 'age': 3}, {'name': 'c', 'age': 10}, {'name': 'd', 'age': 2}, {'name': 'e', 'age': 1}]
person_list = list(map(lambda x: Person(**x), sources))
sorted(person_list, key=attrgetter('age'))
[Person(name='e', age=1),
Person(name='d', age=2),
Person(name='b', age=3),
Person(name='a', age=4),
Person(name='c', age=10)]
Si vous souhaitez trier par ordre décroissant, définissez l'argument inverse de la fonction triée sur True.
Reference
Recommended Posts