私はいつかこれを解決しようとしていますが、インターネットを検索していくつかの本を参照しようとしましたが、解決策を見つけることができませんでした.
ここで提案されている解決策は 1 つありますが、他にもっと簡単な方法があるかどうかはわかりません。参照:浮動小数点値が含まれている Python 辞書の比較
いくつかの指針を教えていただければ幸いです。
背景: {key:{key:{key:[value]}}} 関係を持つ dict_A があります。この dict_A は、反復プロセスを経て、いくつかの制約と最適化目標に基づいてその値を最適化します。最終的に最適化された辞書、つまり dict_B2 が、1 サイクル前に最適化された辞書、つまり dict_B1 と等しい場合にのみ、最適化プロセスを停止します。これは、dict をこれ以上最適化できないという印象を与え、反復サイクルを中断するために使用されます。
質問: 辞書の値に浮動小数点数が含まれているため、格納されている値の一部が変更されます。これは、おそらく辞書が値をバイナリ形式で格納しているためです。以下の例を参照してください。ディクショナリの最初の float 値のバリエーションです。
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]}}}
以下を使用すると、インタラクティブなプロセスが無限ループになり、壊れません。
if (dict_B1==dict_B2):
Exit
また、
if (cmp(dict_B1,dict_B2)):
Exit
18 の浮動小数点精度値から 15 の浮動小数点精度と比較して、辞書を比較する他の方法はありますか?
精度の低い値のフロートを辞書に保存してみました。問題はまだ解決していません。
私を正しい方向に向けるのを手伝ってくれることを願っています。
更新 1: Jakub の提案
Jakubの提案は良いです。フロートを格納する List_B1 と List_B2 という 2 つの中間リストを作成できます。これらは比較に使用され、反復プロセスを中断するタイミングを決定するフラグとして使用されます。
以下は、ケースをテストするために使用されるコードです。List_B2 の 2 番目の項目は意図的に変更されているため、値は精度のしきい値をはるかに超えています。
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
正しくないものを返しますが、コードを分析すると正しく動作します。おそらくreturn all
、OR
ではなくを実行していAND
ます。まだこれをトラブルシューティングしています。
何かヒントがあれば共有してください。これを解決するために引き続き作業します。これまでのすべてのガイダンスについて、Jakub と Julien に感謝します。
rgds サラバナン K