2010-12-07 15 views
1

J'ai besoin de trier un dictionnaire Python par clés, lorsque les clés sont des nombres à virgule flottante en format scientifique.Python, comment trier le dictionnaire par clé, quand les clés sont des nombres à virgule flottante en format scientifique?

Exemple:

a={'1.12e+3':1,'1.10e+3':5,'1.19e+3':7,...} 

J'ai besoin de maintenir des liens clé-valeur inchangée.
Quelle est la manière la plus simple de faire ceci?

+0

S'il vous plaît améliorer votre anglais. –

Répondre

2

Vous pouvez trier les (key, value) paires par la valeur flottante

a={'1.12e+3':1,'1.10e+3':5,'1.19e+3':7,...} 
print sorted(a.iteritems(), key=lambda (x,y):float(x)) 
# [('1.10e+3', 5), ('1.12e+3', 1), ('1.19e+3', 7)] 

Je suppose que vous voulez flotteurs de toute façon par la suite si vous pouvez simplement les convertir tout de suite:

print sorted((float(x),y) for x,y in a.iteritems()) 
# [(1100.0, 5), (1120.0, 1), (1190.0, 7)] 
7

probablement simplement retransférer un numéro:

sorted(a, key = lambda x: float(x)) 
['1.10e+3', '1.12e+3', '1.19e+3'] 

Ce vous donne juste une copie triée des clés. Je ne suis pas sûr si vous pouvez écrire dans un dictionnaire et modifier sa liste de clés (la liste retournée par keys() sur le dictionnaire) sur place. Ça a l'air un peu mal.

+0

Je dois maintenir les liens valeur-clé inchangés – Alex

+0

C'est la réponse que vous cherchez. Les clés dans un dict python doivent être immuables, vous ne pouvez pas les changer si vous essayez. La solution de unwind fournit une fonction lambda qui renvoie une valeur convertie à la fonction de tri. – jkerian

+0

et ils sont inchangés avec cela ... – fortran