2016-06-05 4 views
0

ich eine Python-Liste wie so haben:dict.fromkeys nicht wie erwartet Punkt Schlüssel für Floating

import numpy 

thresholds = numpy.linspace(0.7, 0.9, 21) 

print(thresholds) 

[0.7, 0.71, 0.72, 0.73, 0.74, 0.75, 0.76, 0.77, 0.78, 0.79, 0.8, 0.81, 0.82, 0.83, 0.84, 0.85, 0.86, 0.87, 0.88, 0.89, 0.9] 

Wenn ich versuche, eine dict aus dieser Liste zu erstellen dict.fromkeys(), indem Sie, ist das Ergebnis nicht wie erwartet:

thresholds = dict.fromkeys(numpy.linspace(0.7, 0.9, 21)) 

print(thresholds) 

{0.69999999999999996: None, 0.70999999999999996: None, 0.84999999999999998: None, 0.83000000000000007: None, 0.81000000000000005: None, 0.79000000000000004: None, 0.77000000000000002: None, 0.78000000000000003: None, 0.72999999999999998: None, 0.83999999999999997: None, 0.71999999999999997: None, 0.89000000000000001: None, 0.87: None, 0.80000000000000004: None, 0.76000000000000001: None, 0.90000000000000002: None, 0.73999999999999999: None, 0.88: None, 0.85999999999999999: None, 0.82000000000000006: None, 0.75: None} 

ich war ein dict wie dies erwartet:

{0.7: None, 0.71: None, 0.85: None, 0.83: None, 0.81: None, 0.79: None, 0.77: None, 0.78: None, 0.73: None, 0.84: None, 0.72: None, 0.90: None, 0.87: None, 0.80: None, 0.76: None, 0.90: None, 0.74: None, 0.88: None, 0.86: None, 0.82: None, 0.75: None} 

Warum bekomme ich im letzten dict keine gerundeten Werte und wie gehe ich vor, dies zu korrigieren?

+3

Welches Ergebnis erwarten Sie? –

+1

Beachten Sie, dass die Verwendung von Floats als Wörterbuchschlüssel keine gute Idee ist. – jonrsharpe

+0

Ich erwarte, dass die 'dict'-Tasten genau den Listenwerten entsprechen, ohne eine große Anzahl von Dezimalziffern. – lostsoul29

Antwort

2

Sie können die Floats von numpy.linspace in Strings konvertieren. Die Verwendung von floats direkt als Dictionary-Schlüssel in Python ist eine schreckliche Idee, aus Gründen der Präzision (Sie können nicht auf 100% Präzision wetten) und der Art, wie Gleitkommazahlen ausgewertet werden.

thresholds = numpy.linspace(0.7, 0.9, 21) 

# freezing the precision of your floating point numbers 
stringified_thresholds = [str(i) for i in thresholds] 

thresholds_dict = dict.fromkeys(stringified_thresholds) 

Sie können Ihre Arbeit von hier fortsetzen.

+0

Können Sie Ihre Antwort präzisieren, insbesondere den Teil über Präzisionsmutation? – lostsoul29

+0

'0.4 - 0.1 = 0.30000000000000004' ist ein gutes Beispiel dafür, was mit Floating-Operationen passiert. Sie können nicht auf 100% ige Präzision wetten, was ich meinte –

2

Wenn Sie sich über die Fließkommadarstellungen aufregen, sollten Sie versuchen, die Werte in decimal Typen zu konvertieren. Ansonsten lass es einfach gehen.

print('%1.17f' % 0.7) 
print('%1.2f' % 0.7) 

0.69999999999999996 
0.70 
Verwandte Themen