Trier des chaînes alphanumériques en python

#Python #Django

En concevant une page de Swiss-timber-bridges, j’ai été confronté à un problème classique: trier des chaînes alphanumériques en python, dans un ordre alphabétique mais qui respecte l’ordre naturel des nombres.

En gros, l’idée était de classer des chaînes du genre

dans leur ordre “naturel”. Évidemment, modifier le libellé en “Vitesse maximale 05 Km/h” n’était pas une solution envisageable.

En m’inspirant d’une réponse sur stack overflow, je me suis rendu compte que cela pouvait se faire très simplement. En gros, l’idée est la suivante:

C’est bien entendu plus long à expliquer qu’à coder:

convert = lambda text: int(text) if text.isdigit() else text 
alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ] 
objects.sort(key=lambda x: alphanum_key(x.code))

Bien entendu, cette solution n’est pas d’une efficacité irréprochable. Mais pour des petites quantités de données à trier… disons que ce n’est pas mauvais pour 3 lignes de code!