Supprimer les doublons de la liste et les trier par nombre ? (python 3)

Aug 19 2020

Comment supprimer tous les doublons de la liste et les classer en fonction du nombre ?

s = ["foo", "this", "lem", "foo", "lem"]
s = ["foo", "ebh", "wosv", "wosv", "ebh", "4whcu"]
#should return
>>> ["foo", "lem", "this"]
>>> ["ebh", "wosv", "foo", "4whcu"]

Règles:

  • Doit être plus court que le code ci-dessous en termes de taille d'octet.
  • L'ordre doit être basé sur le nombre de dans l'ordre décroissant.
  • S'il y a deux chaînes avec le même nombre, la première apparition vient en premier
  • Tous les doublons doivent être supprimés, un seul de chaque chaîne doit figurer dans la liste finale

j'ai actuellement

list({}.fromkeys(sorted(s,key=lambda y:-s.count(y))))

J'ai remarqué des réponses comme setmais cela change arbitrairement l'ordre, ce que je ne veux pas.

Edit : Désolé pour la mauvaise qualité avant. Je l'avais fouetté juste avant de dormir et j'étais assez fatigué. Ce n'est pas pour StackOverflow car j'essaie de réduire au maximum la taille de ce code. J'ai essayé de chercher des réponses mais je n'ai rien trouvé.

Réponses

2 xnor Aug 20 2020 at 17:37

44 octets

sorted({}.fromkeys(s),key=s.count,reverse=1)

Essayez-le en ligne !

Une amélioration de ce qui suit, en remplaçant la clé par un intégré plutôt qu'un lambda, et en utilisant reversepour échanger les comparaisons. Nous aimerions plutôt le faire [::-1]sur le résultat final, mais cela ne fait pas les bons tie-breaks stables.


47 octets

sorted({}.fromkeys(s),key=lambda y:-s.count(y))

Essayez-le en ligne !

Une simple transposition de votre code, en déplaçant votre {}.fromkeysastuce de déduplication avant le tri. Étant donné que le tri se transforme en une liste, en extrayant les clés d'un dictionnaire, cela enregistre l' list()appel de l'original.

Pour plus de commodité, le code d'origine est :

53 octets

list({}.fromkeys(sorted(s,key=lambda y:-s.count(y))))

Essayez-le en ligne !