Bonjour,

Comme le dit le titre j’essaie de trier une liste de dictionnaire selon plusieurs key (str ou float) ET en prenant en compte les valeurs vides ou nulles.
C'est surtout ce second point que j'ai du mal à obtenir.

Voici ce que j'ai pour le moment :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
example_liste = [{"A":"M", "B":15.2, "C":"interne"},
                 {"A":"F", "B":"",   "C":"externe"},
                 {"A":"F", "B":5.3,  "C":"externe"},
                 {"A":"",  "B":4,    "C":"externe"}] 
 
keys_to_sort = {"A":{"type":"str","sort":"des"}, "B":{"type":"float","sort":"asc"}}
 
 
#boucle permettant de construire la fonction de tri
final_sort_str = ""
for key, type in keys.items():
    if keys_to_sort["sort"] == "des" :
        if keys_to_sort["type"] == "str" :      final_sort_str += f"float(ord(example_liste[{key}])),"  #ord() pour convertir les lettres en valeurs numériques et float() pour convertir en décimal pour la fonction sorted()
        elif keys_to_sort["type"] == "float" :  final_sort_str += f"float(example_liste[{key}]),"
 
    elif keys_to_sort["sort"] == "asc" :
        if keys_to_sort["type"] == "str" :      final_sort_str += f"-float(ord(example_liste[{key}])),"   # '-' pour inverser le tri 
        elif keys_to_sort["type"] == "float" :  final_sort_str += f"-float(example_liste[{key}]),"
 
final_sort_str  = final_sort_str [:-1] #pour retirer la dernière virgule
 
 
#fonction de tri
sorted_list = sorted(example_list, key=lambda x: (eval(final_sort_str )), reverse=True )

Pour ce code j’obtiens à la fonction de tri ceci "sorted(example_list, key=lambda x: (float(ord(example_liste['A'])), -float(example_liste['B'])), reverse=True )"

Je suis conscient que c'est "bricolé" comme méthode mais ça fonctionne du moment que je n'ai pas de valeurs vides ou nulles dans mes dictionnaires car là j'ai une erreur de type could not convert string to float: ''.
L'idée étant de pouvoir modifier les attributs pris en compte dans le tri en modifiant uniquement la variable keys_to_sort, je ne voit pas comment construire autrement la fonction de tri qu'en générant à part la partie derrière key=lambda x:


Je suis ouvert à tout commentaire pour résoudre ce problème ou même améliorer ma façon de faire.

Merci d'avance