2017-04-17 177 views
-1

我得到了一个字典到一个字典,看起来像这样:第一个字典的关键字是对象,内部字典的关键是对象的参数。一个对象是引用,我需要将所有对象的所有参数的值与该引用对象进行比较,如果有差异打印,如果没有差异,则不执行任何操作。词典是这样的: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',}, 
... 
} 

代码中,我迄今,在裁判是参考对象,字典是字典我上面复制:

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

也许你可以先更新你的问题有点。您在示例的第一行中缺少口音。你也可以用'ref.get(k,None)'替换'try' /'except'构造。最后,语法需要一点关注。 –

+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}) 

如果您将两个列表转换为集合然后减去它们,那么您可以更好地计算额外或丢失的键。

+0

引用对象可以有其他键(参数)。这才是重点。如果有其他对象没有的键,打印它并将其添加到其他对象的值:'无'。这在相反的情况下工作,如果其他对象具有某个键,那么参考没有它的打印值和增加价值:'没有引用obj。当然,如果两个对象具有相同的键,我需要比较它们的值。 @MichaelAshleyCurrin – jovicbg

+0

我得到这个: 为K,V在value.iteritems(): ^ 语法错误:无效的语法 我不知道为什么 – jovicbg

+0

请看到我的最新答案。 – 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

如果您更喜欢印刷上更具描述性的内容,您可以将“None”替换为“missing”或“extra”。 – MikeCPT

+0

问题是我有大约3000个具有300-400个参数的对象,我只复制了一小块。 请稍等片刻 – 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