Python词典比较

2024-05-20 17:33:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我把一个dict转换成一个dict,看起来是这样的:第一个outter dict的键是object,内部dict的键是objects的参数。一个对象是引用,我需要将所有对象的所有参数的值与该引用对象进行比较,如果有差异,则打印它,如果没有差异,则不执行任何操作。Dict看起来像这样:

{'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是我在上面复制的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})

下一个问题是:当引用对象根本没有一些参数,但是其他对象有一些参数时,这个方法很有效,但是当引用对象有一些参数而其他对象没有时,就不会发生什么,也不会找不到它。你知道吗


Tags: 对象reffalsetrue参数objectmain差异
3条回答

下面是一个更详细的答案。查看这是否适用于检查键和值。你知道吗

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)

您可以这样尝试:

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

我知道如何对照引用对象进行检查,但是引用对象可能有其他键。你知道吗

所以我会添加一个测试来检查钥匙是否相同。我在这里打印,但你可以记录到字典或错误列表。你知道吗

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

如果将两个列表转换为集合,然后减去它们,则可以更好地计算多余或缺少的键。你知道吗

相关问题 更多 >