149 votes

Trier une liste de listes avec une fonction de comparaison personnalisée

Je sais qu'il existe plusieurs questions de ce type, mais elles ne semblent pas fonctionner pour moi.

J'ai une liste de listes, 50 fois 5 éléments. Je souhaite trier cette liste en appliquant une fonction de comparaison personnalisée à chaque élément. Cette fonction calcule l'aptitude de la liste en fonction de laquelle les éléments doivent être triés. J'ai créé deux fonctions, compare et fitness :

def compare(item1, item2):
    return (fitness(item1) < fitness(item2))

et

def fitness(item):
    return item[0]+item[1]+item[2]+item[3]+item[4]

J'ai ensuite essayé de les appeler :

sorted(mylist, cmp=compare)

ou

sorted(mylist, key=fitness)

ou

sorted(mylist, cmp=compare, key=fitness)

ou

sorted(mylist, cmp=lambda x,y: compare(x,y))

J'ai également essayé list.sort() avec les mêmes paramètres. Mais dans tous les cas, les fonctions ne reçoivent pas une liste en argument, mais un fichier None . Je n'ai aucune idée de la raison de cela, venant principalement du C++, cela contredit toute idée de fonction de rappel pour moi. Comment puis-je trier ces listes avec une fonction personnalisée ?

Editer J'ai trouvé mon erreur. Dans la chaîne qui crée la liste originale, une fonction n'a rien retourné mais la valeur de retour a été utilisée. Désolé pour le dérangement

4voto

Je suis tombé sur ce fil de discussion pour trier la liste des listes par fonction de comparaison. Pour ceux qui ne connaissent pas Python ou qui viennent d'une formation en C++, nous voulons reproduire l'utilisation de la fonction de rappel comme en C++. J'ai essayé avec la fonction sorted().

Par exemple : si nous voulons trier cette liste en fonction des notes (ordre croissant) et, si les notes sont égales, en fonction du nom (ordre croissant).

students= [['Harry', 37.21], ['Berry', 37.21], ['Tina', 37.2], ['Akriti', 41.0], ['Harsh', 39.0]]

def compare(e):
  return (e[1],e[0])

students = sorted(students,key=compare)

Après le tri :

[['Tina', 37.2], ['Berry', 37.21], ['Harry', 37.21], ['Harsh', 39.0], ['Akriti', 41.0]]

3voto

Zeus Points 1643

Pour python3x

arr = [1, 33, 23, 56, 9]

def compare_func(x, y):
     return x - y

1. utiliser arr.sort avec la fonction compare

arr.sort(key=cmp_to_key(compare_func))

2.Utilisation sorted pour obtenir nouvelle liste

new_list = sorted(arr, key=cmp_to_key(lambda x, y: x - y)))

3. utiliser arr.sort avec lambda

arr.sort(key=cmp_to_key(lambda x, y: x - y))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X