Pythonic moyen de tri de la liste de namedtuples par nom de champ
Je veux trier une liste de uplets nommé sans avoir à se souvenir de l'indice de la fieldname. Ma solution semble plutôt maladroit et a été en espérant que quelqu'un aurait une solution plus élégante.
from operator import itemgetter
from collections import namedtuple
Person = namedtuple('Person', 'name age score')
seq = [
Person(name='nick', age=23, score=100),
Person(name='bob', age=25, score=200),
]
# sort list by name
print(sorted(seq, key=itemgetter(Person._fields.index('name'))))
# sort list by age
print(sorted(seq, key=itemgetter(Person._fields.index('age'))))
Grâce,
Nick
- Est le nom du champ est toujours donné comme une chaîne de caractères ou la solution par @clyfish aussi le travail?
- Je n'étais pas en train de faire quelque chose de dynamique, de sorte que les deux solutions fonctionnent parfaitement.
Vous devez vous connecter pour publier un commentaire.
Trier la liste par nom
Trier la liste par âge
attrgetter
attrgetter
effectue beaucoup mieux etlambda
s arent généralement considéré comme élégantsorted(seq, key=lambda x: [x.age, x.name])
sortes par plusieurs attributsJ'ai testé les deux solutions données ici pour la vitesse, puisque @zenpoy était préoccupé par la performance.
Script de test:
Résultats:
À l'aide de lambda est en effet plus lent. Jusqu'à 10% plus lent.
MODIFIER:
D'autres tests montre les résultats obtenus lors du tri de l'utilisation de plusieurs attributs. Ajouté les deux cas de test avec la même configuration:
Résultats:
Lambda encore connaît une contre performance, mais moins. Maintenant environ 5% plus lent.
Tests sont effectués sur le Python 3.6.0.
puisque personne n'a mentionné l'aide de itemgetter(), voici comment le faire en utilisant itemgetter().
Cela peut être un peu trop "magique" pour certains, mais je suis partie à l':