2017-04-17 12 views
-1

私はdictにdictを持っています。次のようになります。最初のoutter dictのキーはオブジェクトであり、内部dictsのキーはオブジェクトのパラメータです。 1つのオブジェクトは参照であり、すべてのオブジェクトのすべてのパラメータの値をその1つの参照オブジェクトと比較する必要があります。差異がある場合はそれを出力し、差分がない場合は何も行いません。 dictのは、次のようになります。Python辞書の比較

{'object-1301': {'act1': 'false', 
    'act1x': 'true', 
    'act': 'false', 
    'actAdv': 'false', 
    'actAe': 'false', 
    'actArp': 'false',}, 
'object-218': {'act1': 'true', 
    'act1x': 'false', 
    'act': 'false', 
    'actAdv': 'false', 
    'actAe': 'true', 
    'actArt': 'false',}, 
... 
} 

コードrefは参照オブジェクトです私はこれまでされ、dictのは、私が上記コピーされた辞書できました:

main_dif = {} 
for key, value in dict.iteritems(): 
    dif_k = {} 
    for k, v in value.iteritems(): 
     try: 
      a = ref[k] 
     except: 
      a = None 
     if a != v: 
       dif_k.update({k:v}) 
    main_dif.update({key:dif_k}) 

私が持っている問題は次です:とき参照オブジェクトすべてのパラメータを持っていないが、いくつかの他のオブジェクトが、これはうまく動作しますが、参照オブジェクトが持っていて、他のオブジェクトがない場合、何も起こりません、それを見つけることができません。

+1

。あなたの例の最初の行にアクセントがありません。また、 'try' /' except'構造を 'ref.get(k、None)'で置き換えることもできます。最後に、文法はちょっとした注意が必要です。 –

+0

@Tom de Geus 私は自分の質問を編集しました。私は行を欠場しない、なぜあなたはそれを考えるのですか? – jovicbg

+0

あなたは何をやろうとしていますか? – manvi77

答えて

0

参照オブジェクトを確認する方法はわかりますが、参照オブジェクトには他のキーがある可能性があります。

だから、私はキーが同一であることを確認するテストを追加します。私はここに印刷していますが、それを辞書やエラーリストに記録することができます。

main_dif = {} 
for key, value in dict.iteritems(): 
    dif_k = {} 

    if value.keys() != ref.keys(): 
     print('Key mismatch for {0}'.format(key)) 
     print('Ref: {0}. Actual: {1}'.format(ref.keys(), value.keys()) 

    for k, v in value.iteritems(): 
     try: 
      a = ref[k] 
     except: 
      a = None 
     if a != v: 
       dif_k.update({k:v}) 
    main_dif.update({key:dif_k}) 

2つのリストをセットに変換してから差し引くと、余分なキーや欠落したキーをより適切に計算できます。

+0

参照オブジェクトは他のキー(パラメータ)を持つことができます。それがポイントです。他のオブジェクトが持っていないキーがある場合は、それを印刷して他のオブジェクトの値に 'None'という値を追加します。逆の状況では、他のオブジェクトがキーを持っていれば参照できません。値を追加してください: 'objを参照しないでください。もちろん、両方のオブジェクトが同じキーを持つ場合、その値を比較する必要があります。私は – jovicbg

+0

@MichaelAshleyCurrin私はこれを得ました。 – jovicbg

+0

は私の最新の答えを参照してください理由はわかりません無効な構文 :value.iteritemsでK、V(用 ): ^ にSyntaxError – MikeCPT

1

これは、より詳細な回答です。キーと値をチェックするためにこれが機能するかどうかを確認してください。

from pprint import pprint 

# Use your own ref, I've just this one all to true for testing. 
ref = { 
    'act1': 'true', 
    'act1x': 'true', 
    'act': 'true', 
    'actAdv': 'true', 
    'actAe': 'true', 
    'actArp': 'true', 
    } 

data = { 
    'object-1301': { 
     'act1': 'false', 
     'act1x': 'true', 
     'act': 'false', 
     'actAdv': 'false', 
     'actAe': 'false', 
     'actArp': 'false', 
    }, 
    'object-218': { 
     'act1': 'true', 
     'act1x': 'false', 
     'act': 'false', 
     'actAdv': 'false', 
     'actAe': 'true', 
     'actArt': 'false', 
    }, 
    'object-short': { 
     'act1': 'false' 
     }, 
    'object-extra-keys': { 
     'act1': 'true', 
     'act1x': 'true', 
     'act': 'true', 
     'actAdv': 'true', 
     'actAe': 'true', 
     'actArp': 'true', 
     'extra': 'true', 
    }, 
    'object-as-ref': { 
     'act1': 'true', 
     'act1x': 'true', 
     'act': 'true', 
     'actAdv': 'true', 
     'actAe': 'true', 
     'actArp': 'true', 
     }, 
    'object-opposite-to-ref': { 
     'act1': 'false', 
     'act1x': 'false', 
     'act': 'false', 
     'actAdv': 'false', 
     'actAe': 'false', 
     'actArp': 'false', 
    } 
} 

mainDiff = {} 

for obj, objDict in data.iteritems(): 
    currentDict = {} 

    # Check if the keys match. 
    if objDict.keys() != ref.keys(): 
     for key in ref: 
      if key not in objDict.keys(): 
       # Store keys missing from object. 
       currentDict[key] = None 

     for key in objDict: 
      if key not in ref.keys(): 
       # Store unexpected values in object. 
       currentDict[key] = None 

    # Check if values are the same. 
    for k, v in objDict.iteritems(): 
     # Check if the key is in ref to avoid error 
     if k in ref: 
      # Then compare if values are equal 
      if ref[k] != objDict[k]: 
       # Then store actual value 
       currentDict[k] = v 
    # Store differences for current object against object title. 
    mainDiff[obj] = currentDict 

print 'Differences:' 
pprint(mainDiff) 
+0

あなたは、印刷に関してもっと記述的なものを好む場合は、「なし」を「不足」または「余分」に置き換えることができます。 – MikeCPT

+0

問題は、300〜400のパラメータを持つ3000個のオブジェクトがあり、小さな部分だけをコピーしたことです。 ちょっと待ってください – jovicbg

+0

ああ、このような仕事ですが、確かに確認するには数分かかります。 – jovicbg

0

あなたはこのように試すことができます:たぶんあなたが最初にあなたの質問は少しを更新することができます

In [17]: refdict 
Out[17]: 
{'object-1301': {'act': 'false', 
    'act1': 'false', 
    'act1x': 'true', 
    'actAdv': 'false', 
    'actAe': 'false', 
    'actArp': 'false'}} 

In [18]: mydict 
Out[18]: 
{'object-218': {'act': 'false', 
    'act1': 'true', 
    'act1x': 'false', 
    'actAdv': 'false', 
    'actAe': 'true', 
    'actArt': 'false'}} 

for k, v in refdict.iteritems(): 
    for k1, v1 in mydict.iteritems(): 
     if k != k1: 
      print('Checking for object: {0}'.format(k1)) 
      for k2, v2 in v.iteritems(): 
       if k2 in v1: 
        if v[k2] == v1[k2]: 
         continue 
        else: 
         print "Differences" 
         print('For Key {0}, Value {1} are different'.format(k2, v1[k2])) 
       else: 
        print "Missing key in current object" 
        print k2 
      for k3 in v1: 
       if k3 not in v: 
        print "Missing key in reference object" 
        print k3 

#result 
Checking for object: object-218 
Differences 
For Key act1, Value true are different 
Differences 
For Key actAe, Value true are different 
Missing key in current object 
actArp 
Differences 
For Key act1x, Value false are different 
Missing key in reference object 
actArt 
関連する問題