Desidero confrontare una coppia di dizionari e utilizzare il confronto in virgola mobile "fuzzy" o meglio ancora utilizzare numpy.allclose()
per farlo. Tuttavia, l'utilizzo del valore predefinito ==
o !=
in Python per dict non lo fa.Confronto di dic di Python con valori in virgola mobile inclusi
Mi chiedevo se ci fosse un modo per cambiare l'operazione di confronto in virgola mobile (probabilmente usando un gestore di contesto per una pulizia sicura).
Credo che un esempio possa essere d'aiuto. Ho un dict profondamente annidato che contiene tutti i tipi di valori. Alcuni di questi valori sono valori a virgola mobile. So che ci sono un sacco di insidie per 'il confronto' valori in virgola mobile, ecc
d1 = {'a': {'b': 1.123456}}
d2 = {'a': {'b': 1.1234578}}
Vorrei utilizzare !=
a confrontare questi due dicts e lo hanno restituire True
se le uniche differenze sono numeri in virgola mobile all'interno di un certo intervallo. Ad esempio, non contare i valori diversi se sono chiudi (non sono sicuro della precisione che voglio ancora).
Suppongo che potrei ricorsivamente passare attraverso le dicts me stesso e basta usare manualmente numpy.allclose()
per valori a virgola mobile e ripiegare per l'uguaglianza normale test per tutti gli altri tipi, ecc, tuttavia, questo è un po 'complicato e soggetto a errori. Penso che questa sarebbe una soluzione accettabile, e mi piacerebbe vederne una simile. Spero comunque che ci sia qualcosa di più elegante.
L'elegante soluzione nella mia testa sarebbe simile a quanto segue. Tuttavia, non so se qualcosa di simile è ancora possibile:
with hacked_float_compare:
result = d1 != d2
Così, all'interno di questo contesto, direttore mi sarebbe la sostituzione del confronto in virgola mobile (solo per float()
valori standard con entrambi i miei confronto o numpy.allclose()
.
Ancora una volta, non sono sicuro che ciò sia possibile perché la patch delle scimmie float()
non può essere eseguita poiché è scritta in C
. Vorrei anche evitare di dover modificare ogni valore in virgola mobile nei Dits sul mio classe float che ha un __eq__()
. Forse questo è il migliore w però?
Un'opzione sarebbe quella di creare un wrapper per float ed override '__eq__' lì. – NullUserException
Ma avresti bisogno di creare tutti i tuoi float con 'fuzzyfloat (0.5)', ecc. – alexis
Giusto. So che questo approccio funziona, ma non volevo usare un oggetto/classe speciale se potessi evitarlo. In questo caso ho solo bisogno che il confronto sia "sfocato". Questo è il motivo per cui speravo di utilizzare un gestore di contesto e di andare in una "modalità" diversa per un periodo di tempo limitato. –