我試圖解決這個問題,嘗試搜索互聯網和引用一些書,但一直沒能找到解決方案。比較兩個字典 - 浮點
這裏提出了一種解決方案,但不確定是否還有其他更簡單的方法。 參考:Comparing Python dicts with floating point values included
希望你能給一些指點。
背景: 有dict_A附帶{key:{key:{key:[value]}}}關係。這個dict_A將通過一個迭代過程來基於幾個約束和一個優化目標來優化其價值。只有當最終優化的字典,即dict_B2與dict_B1之前的字典優化的一個週期相等時,才停止優化過程。這給人的印象是字典不能進一步優化,這被用來打破迭代週期。
問題: 由於字典值包含浮點數,所以某些存儲值會被更改,可能是因爲字典以二進制格式存儲值。請參考下面的例子,字典中第一個浮點值的變化。
dict_B1 = {0: {36: {3: [-1], 12: [0.074506333542951425]}}, 1: {36: {2: [-1], 16: [0.048116666666666676], 17: [-1]}}, 2: {}, 3: {36: {5: [-1], 6: [-1], 15: [0.061150932060349471]}}}
dict_B2 = {0: {36: {3: [-1], 12: [0.074506333542951439]}}, 1: {36: {2: [-1], 16: [0.048116666666666676], 17: [-1]}}, 2: {}, 3: {36: {5: [-1], 6: [-1], 15: [0.061150932060349471]}}}
如果我使用下面的Interative的過程進行無限循環,不打破,
if (dict_B1==dict_B2):
Exit
,或者
if (cmp(dict_B1,dict_B2)):
Exit
是否有任何其他的方式來比較的字典說,與來自18個浮點精度值的15個浮點精度進行比較?
我試圖在字典中存儲較小的精度值浮點數。問題仍然存在。
希望你能幫助我指出正確的方向。
更新1:的Jakub的建議
的Jakub的建議是好的。我可以創建兩個中間列表,即List_B1和List_B2來存儲浮點數,這些將用於比較和作爲一個標誌來決定何時打破迭代過程。
以下是用於測試案例的代碼。 List_B2中的第二項被故意改變,所以該值超出精度閾值。
def is_equal(floats_a, floats_b, precision=1e-15):
return all((abs(a-b) < precision) for a, b in izip(floats_a, floats_b))
List_B1=[0.074506333542951425,0.048116666666666676,0.061150932060349471]
List_B2=[0.074506333542951439,9.048116666666666676,0.061150932060349471]
print "is_equal(List_B1,List_B2):",is_equal(List_B1,List_B2)
for a, b in izip(List_B1, List_B2):
print a,b, (abs(a-b) < 1e-15)
結果:
is_equal(List_B1,List_B2): True
0.074506333543 0.074506333543 True
0.0481166666667 9.04811666667 False
0.0611509320603 0.0611509320603 True
奇怪is_equal
函數總是返回TRUE
這是不正確的,但在disected的代碼,它工作正常。也許return all
正在做OR
而不是AND
。仍然排除故障。
如果您有任何提示,請分享。將繼續努力解決這個問題。感謝Jakub和Julien爲您提供的所有指導。
RGDS Saravananķ
感謝您的幫助@Jakub M.已經測試過這個並且已經提交了我的更新,如上所述。將繼續工作並更新所有 – 2013-04-28 19:10:27