2010-11-27 20 views
2

Disons que j'ai un dict: d = {'Abc': 5, 'Jack': 4, 'amy': 9, 'Tom': 0, 'abc': 5}Éléments de tri Python par une règle définie spécifique

Si je veux écrire une fonction telle que si je passe cette fonction à la fonction de tri intégrée, par exemple. list (d) .sort (function), la fonction de tri va trier la liste en fonction des valeurs, de toutes les valeurs identiques, les trier par leurs clés (ordre alphabétique). Donc, dans ce cas, d = {'Abc': 5, 'Jack': 4, 'amy': 9, 'Tom': 0, 'abc': 5, 'TAM': 0} renvoie ['amy' , 'Abc', 'abc', 'Jack', 'TAM', 'Tom'] La fonction devrait ressembler à ceci:

def arrange_items(something, thing,**may be a function**): 
     if something < thing: 
       return -1 
     elif something > thing: 
       return 1 
     etc 

si j'appelle some_list.sort (arrange_items), je devrais une liste triée retour

Merci d'avance

Modification du cahier des charges (une autre question): si j'ai un dict de twitter nom de l'utilisateur, le dict est dans ce format:

dict = {'JohnZ':{'name': Jonny Zue,'follow':'MiniT',}, etc} # JohnZ is one of the twitter user. The follow means people that JonhZ follows, in this case it is MiniT. 

Popularité d'un utilisateur signifie que le nombre de personnes qui suivent cet utilisateur particulier, dans l'exemple ci-dessus, la popularité de MiniT est au moins un b/c il y a au moins un utilisateur suivez MiniT. Disons que j'ai une liste de noms d'utilisateur de Twitter, disons L1 = ['JonhZ', 'MiniT', etc], et je veux trier L1 en fonction de la popularité des utilisateurs (une popularité plus élevée vient en premier). dict est déjà défini dans l'espace de nom global (nous pouvons directement accéder à dict). L'exigence pour cette fonction de tri est d'utiliser L1.sort (pass_function) Comment dois-je écrire la fonction pass_function de telle sorte que sort triera automatiquement L1 en fonction de la popularité des utilisateurs.

Merci pour aider

Répondre

2
[k for k, v in sorted(d.iteritems(), key=lambda x: (-x[1], x[0].lower()))] 

EDIT:

(je refuse d'utiliser le nom "dict" car il ombres un builtin, et l'ombre builtins est stupide)

L1.sort(key=lambda x: (-d.get(x, 0), x.lower())) 
+0

dire quelque chose est "stupide" n'est pas utile. l'ombrage construit ins peut être dangereux et encombrant pour l'interprète et pour les futurs codeurs. mais pas "stupide" – franklin

0

Vous ne pouvez pas le faire avec list (d) .sort (function), car vous obtiendrez une liste avec les clés du dictionnaire. Vous pouvez atteindre votre objectif avec approche alternative:

l1 = sorted(d.items(), key=lambda x: (x[1], x[0])) 
l2 = sorted(l1, key=lambda x: x[1], reverse=True) 
result = [x[0] for x in l2] 

Cette approche convertit le dictionnaire à la liste des (clé, valeur) tuples. Alors l1 est trié par les valeurs et l2 est trié par les clés. Puisque python a un algorithme de tri stable, l'ordre des valeurs est préservé pour des clés identiques. Editer: L'approche d'Ignacio Vazquez-Abrar est similaire, mais plus élégante, car la liste ne doit être triée qu'une seule fois.