2010-06-03 7 views
2

J'ai un hashmap comme ceci:tri en python

results[tweet_id] = {"score" : float(dot(query,doc)/(norm(query) * norm(doc))), "tweet" : tweet} 

Ce que je voudrais faire est de trier les résultats par la innser clé « score ». Je ne sais pas comment c'est possible, j'ai vu beaucoup de tutoriels de tri mais ils étaient pour des structures de données simples (non imbriquées).

+0

Pour clarifier: est '' results' un dict' ou un 'list'? À partir de votre code, je suppose que c'est un dict puisque je devine que 'tweet_id' est une clé de dictionnaire, pas une variable de compteur. –

Répondre

4
>>> results=[{"s":1,"score":100},{"s":2,"score":101},{"s":3,"score":99},{"s":4,"score":1},{"s":5,"score":1000}] 

>>> from operator import itemgetter 

>>> sorted(results, key=itemgetter("score")) 
[{'s': 4, 'score': 1}, {'s': 3, 'score': 99}, {'s': 1, 'score': 100}, {'s': 2, 'score': 101}, {'s': 5, 'score': 1000}] 
+0

Mais je pense que son 'results' est un' dict', pas une 'list', et ne peut donc pas être trié. –

+1

@Tim: 'results' est une liste de' dict', et puisque les valeurs sont hashable, elles peuvent être triées. :] –

+0

Oui, dans le code de @ S.Mark, mais pas dans le code de @ tipu. Ai-je tort? –

2

Vous pouvez utiliser sorted avec operator.itemgetter afin d'utiliser la valeur « score » comme la clé:

sorted_results = sorted(results,key=operator.itemgetter("score")) 
3

Vous pouvez trier en utilisant une fonction de comparaison personnalisée comme ceci:

results.sort(key=lambda x:x['score']) 
1

En supposant que votre results est un dict (parce que vous l'avez appelé un hashmap, et parce que je devine que tweet_id est une clé de dictionnaire, pas un compteur), vous devez d'abord le convertir en une liste afin de pouvoir le trier. En Python 3:

results = {} 
results["1234"] = {"score": 123, "tweet": "Hello"} 
results["4321"] = {"score": 321, "tweet": "there"} 
results["abcd"] = {"score": 111, "tweet": "sailor!"} 
l=[] 
for key, value in results.items(): # use .iteritems() in Python 2.x 
    l.append([key, value]) 

for item in sorted(l, key=lambda x: x[1]["score"]): 
    print(item) 

volonté sortie

['abcd', {'tweet': 'sailor!', 'score': 111}] 
['1234', {'tweet': 'Hello', 'score': 123}] 
['4321', {'tweet': 'there', 'score': 321}] 
+0

+1 pour la convertir en tableau triable. – YOU