2015-04-10 1 views
3

J'ai presque terminé mon problème de tri, avec de nombreuses heures à surfer sur le Web. Je suis tombé sur un guide extrêmement utile pour trier les dictionnaires en Python, mais un problème qui semble récurrents quand j'essaie de trier est le fait que mes données qui nécessitent un tri sont un type de données float.Tri des décimales dans un dictionnaire

Exemple de comment je crée 'names'x' 'et 'avmph'x'' des variables

file1=open("1.txt",'r') 
line1=file1.readlines() 
names1=line1[0].rstrip('\n') 
avmph1=line1[3].rstrip('\n') 

mydict={names1:avmph1, 
    names2:avmph2, 
    names3:avmph3, 
    names4:avmph4, 
    names5:avmph5, 
    names6:avmph6, 
    names7:avmph7, 
    names8:avmph8, 
    names9:avmph9, 
    names10:avmph10} 

for key, value in sorted(mydict.items(),key=lambda item:(item[1],item[0])): 
    print ("%s : %s" % (key,value)) 

Le résultat que je reçois est comme suit:

1987dodd : 10 
3219guy : 11.6 
2198adams : 12.2 
8765james : 13.2 
4321jones : 6.3 
5432kane : 6.3 
9876smith : 6.5 
8754smith : 8.7 
7654max : 9 
6543dunne : 9.5 
#seems to sort values that are greater than 10 (2 digits before decimal) separately 

Je ne suis pas sûr de la façon dont pour éditer mon code existant comme .sort (float) a travaillé sur mon 'avmph' seul, cette méthode devrait me permettre de retourner à la fois 'noms' et 'avmph'. Toute aide serait très obligée.

Répondre

6

Vous devez jeter flotter:

(float(item[1]),item[0])) 

Vous triez les chaînes pas la valeur réelle float:

In [1]: "13.2" < "6.3" 
Out[1]: True 

In [2]: float("13.2") < float("6.3") 
Out[2]: False 

Parce que ord("6") > ord("1")"6.3" est considéré> .

Pas tout à fait sûr de savoir comment le nom et avmph en ligne, mais vous s'ils sont sur chaque seconde ligne, vous pouvez faire quelque chose comme:

with open("1.txt") as f: 
    d = {next(f).rstrip():next(f).rstrip() for line in f} 

next(f).rstrip() avances à la ligne suivante chaque appel que nous âne chaque seconde ligne comme clé et valeur. with fermera automatiquement votre fichier.

+0

Merci beaucoup, cela a fonctionné instantanément. – ryan2405

+0

@ ryan2405 pas de soucis, comment créez-vous 'names2' etc.? –

+0

Juste en utilisant la première section de code (évidemment échanger 1 pour 2). Les exigences du travail ne demandent pas d'efficacité et mon professeur continue d'exprimer le fait. J'ai essayé les boucles en vain. Tout mon code pourrait faire un gros effort pour augmenter l'efficacité, mais il accomplit sa tâche spécifique et je suis malheureusement à court de temps. – ryan2405