J'ai cherché pendant des heures un moyen de trier les objets en fonction de l'ordre de tri d'une autre liste d'int mais je n'ai pas trouvé.

J'ai essayé

newList = [element for _,element in sorted(zip(listOfInt, listOfObjects))]

Mais il affiche l'erreur suivante :

"'<' not supported between instances of 'Object' and 'Object'"

Je pense que le problème réside dans la partie "sorted(zip(listOfInt, listOfObjects))" mais je ne sais pas comment résoudre ce problème ou s'il existe un autre moyen de le faire.

1
Clark Yung 21 mars 2021 à 03:23

2 réponses

Meilleure réponse

Normalement, votre approche conviendrait si listOfInts ne contenait pas de doublons. Les listes et les tuples sont comparés lexicographiquement, donc lorsqu'il y a un doublon, le deuxième élément de chaque tuple est comparé. Pour éviter cela, vous pouvez insérer un élément dans la clé avant les objets incomparables :

newList = [element for _, (_, element) in sorted(zip(listOfInt, enumerate(listOfObjects)))]
1
Mad Physicist 21 mars 2021 à 00:40

Vous pouvez l'écrire comme ceci :

newList = [
    elem[1]
    for elem in sorted(zip(listOfInt, listOfObjects), key=lambda tup: tup[0])
]

L'application de zip à List[int] et List[Object] renvoie ici une séquence de Tuple[int, Object]. Le key de sorted permet de définir la clé de tri relative aux éléments de la liste (dans ce cas, en prenant l'entier). La méthode sort de list prend en charge le même argument (voici la documentation). La compréhension externe récupère l'élément du tuple qui vous intéresse (le Object) post-tri. Étant donné que vous voulez trier List[Object] le long de la liste des entiers, cela devrait fonctionner.

La raison de cette erreur :

'<' not supported between instances of 'Object' and 'Object'

Est que si vous ne spécifiez key, la comparaison ici est entre Tuple[int, Object]s. Lorsque chaque tuple est comparé, les int seront comparés en premier, et puis les Object seront comparés si les int ne peuvent pas déterminer le résultat (donc le Object doit prendre en charge une méthode de comparaison).

1
crcvd 21 mars 2021 à 00:49