0
votes

TypeError: '<' non pris en charge entre les instances de «générateur» et «générateur»

Lorsque j'exécute ce code qui trie une liste de (str, int) tuples :

list.sort (clé = lambda x: (ABS (S - x [1]), X [1], LEN (x [0]), (255 - ORD (i) pour i in x [0])))

Il renvoie l'erreur suivante: TypeError: '<< non pris en charge entre les instances de "générateur" et "générateur"

que j'ai trouvé que c'est à cause de (255 - ord (i) pour i in x [0]) qui trie les cordes dans l'ordre lexicographique inversé.

Quelqu'un peut-il vous éclairer pourquoi je reçois cette erreur?


2 commentaires

Pouvez-vous poster les données et la sortie attendue


@ komatiraju032 Les données sont comme ceci [('Nicole', 30), ('Lauren', 6), ('Mila', 24)]] et il doit d'abord trier le int < / code> par sa proximité d'un int S , puis par ordre croissant de int , puis par la longueur du str < / code>, puis finalement par son ordre lexicographique inversé.


4 Réponses :


1
votes

Si vous essayez Imprimer (type ((i pour i dans la plage (10)))) , vous pouvez voir en réalité une génératrice. Donc, la bonne façon de faire la même chose est de le convertir en tuple tuple (i pour i in gamme (10)) ou utilisez une liste de compréhensions [i car i car je in large (10)]

EDIT:

OK Je pense maintenant je comprends ce que tu veux faire. En fait, c'est une logique complexe, je ne vous suggère pas d'utiliser une expression de Lambda. Mais si vous voulez vraiment, veuillez le faire ci-dessous: xxx

Ceci signifie, vous construisez d'abord un tuple de 3 éléments, puis ajouté votre chaîne après caculée.


0 commentaires

0
votes

Vous devez transmettre une fonction qui compare un seul élément de la liste, dans ce cas un élément tuple de (str, int) afin que vous puissiez comparer un seul élément de chaîne avec un autre: Je ne suis pas sûr d'avoir compris ce que vous essayez de réaliser avec ce code, peut-être que vous pouvez essayer ceci: xxx

mais vous pouvez laisser python faire la chose pour vous: < Pré> xxx


1 commentaires

Cela résout le problème lorsque la chaîne a un seul caractère uniquement. Mais que si c'est un mot?



1
votes

Essayez ceci:

fun = lambda x: (abs(s - x[1]), x[1], len(x[0]), [255 - ord(char) for char in x[0]]) 
y = sorted(lst, key = fun)


1 commentaires

Pourquoi a-t-il fonctionné en ajoutant un support? Merci btw.



1
votes

en utilisant ord code> ne trie pas dans l'ordre lexicographique. Il ressemble de près l'ordre lexicographique pour certaines langues dans certains cas, mais a de nombreuses particularités. Pour les démarrages, en anglais il trie B code> avant A code>. Si vous souhaitez qu'il soit réel de tri lexicographique, vous devez utiliser locale.strxfrm code> dans votre clé, avec votre paramètre local correctement défini. locale.setlocale (locale.lc_collate, '') code> est généralement suffisant pour vous assurer que votre paramètre local est réglé correctement pour le tri.

[('MILA', 30), ('NICOLE', 30), ('LAUREN', 30)]


0 commentaires