比较两个字典并检查多少对(键,值)相等


245

我有两个字典,为简单起见,我将采用以下两个:

>>> x = dict(a=1, b=2)
>>> y = dict(a=2, b=2)

现在,我想比较中的每一key, value对是否x具有相同的对应值y。所以我这样写:

>>> for x_values, y_values in zip(x.iteritems(), y.iteritems()):
        if x_values == y_values:
            print 'Ok', x_values, y_values
        else:
            print 'Not', x_values, y_values

而且它有效,因为tuple返回了a ,然后比较了相等性。

我的问题:

这样对吗?有更好的方法吗?最好不要提速,我是在讲代码优雅。

更新:我忘了提到我必须检查多少key, value对是相等的。



x == y应该为true。可以快速签入REPL。请参阅:docs.python.org/2/library/stdtypes.html#mapping-types-dict
Vikrant

Answers:


179

如果您想知道两个字典中有多少个值匹配,您应该说:)

也许是这样的:

shared_items = {k: x[k] for k in x if k in y and x[k] == y[k]}
print len(shared_items)

1
如果有字典键的列表元素,则会发生相同的错误。我认为cmp是更好的方法,除非我丢失任何东西。
突变

@Mutant是另一个问题。您不能首先创建带有list键的字典。x = {[1,2]: 2}将失败。问题已经有效dicts
AnnanFay 2015年

@annan:错了,这个问题是通用的。问题描述中的示例已经有“有效字典”。如果我发布了一个新问题,标题相同,但“无效”格不同,则有人会将其标记为重复。投票失败。
ribamar

6
@ribamar的问题是“比较两个字典[...]”。上面带有list键的“无效字典” 不是有效的python代码-字典必须是不可变的。因此,您不比较字典。如果尝试使用列表作为字典键,则代码将无法运行。您没有要比较的对象。这就像输入内容,x = dict(23\;dfg&^*$^%$^$%^)然后抱怨比较不适用于字典。当然不会起作用。另一方面,蒂姆的评论是可变的values,因此为什么我说这些是不同的问题。
AnnanFay

1
@MikeyE- set要求值是可哈希的,并且dict要求键是可哈希的。 set(x.keys())将始终有效,因为要求键必须是可哈希的,但是set(x.values())对于不可哈希的值将失败。
蒂姆·迪斯达尔

173

您想要做的就是 x==y

您所做的并不是一个好主意,因为字典中的项目不应该有任何顺序。您可能正在[('a',1),('b',1)][('b',1), ('a',1)](相同的词典,不同的顺序)进行比较。

例如,请参见:

>>> x = dict(a=2, b=2,c=3, d=4)
>>> x
{'a': 2, 'c': 3, 'b': 2, 'd': 4}
>>> y = dict(b=2,c=3, d=4)
>>> y
{'c': 3, 'b': 2, 'd': 4}
>>> zip(x.iteritems(), y.iteritems())
[(('a', 2), ('c', 3)), (('c', 3), ('b', 2)), (('b', 2), ('d', 4))]

区别只是一个项目,但是您的算法将看到所有项目都是不同的


@ THC4k,很抱歉没有提及。但是我必须检查两个字典中有多少个值匹配。
user225312 2010年

好的,所以根据我的更新,我的工作方式仍然不正确吗?
user225312 2010年

@AA:我补充了为什么当您想要计数时您的不起作用。
Jochen Ritzel 2010年

我知道了,但就我而言,两个字典的长度相同。他们将一直如此,因为这就是程序的工作方式。
user225312

5
从Python 3.6开始,dict是开箱即用的。
菲尔(Phil)

161
def dict_compare(d1, d2):
    d1_keys = set(d1.keys())
    d2_keys = set(d2.keys())
    shared_keys = d1_keys.intersection(d2_keys)
    added = d1_keys - d2_keys
    removed = d2_keys - d1_keys
    modified = {o : (d1[o], d2[o]) for o in shared_keys if d1[o] != d2[o]}
    same = set(o for o in shared_keys if d1[o] == d2[o])
    return added, removed, modified, same

x = dict(a=1, b=2)
y = dict(a=2, b=2)
added, removed, modified, same = dict_compare(x, y)

7
这个实际上在字典中处理可变值!
蒂姆·提斯达尔

1
当我运行此命令时,看到可变值时仍然出现错误:ValueError:DataFrame的真值不明确。使用a.empty,a.bool(),a.item(),a.any()或a.all()。
Afflatus'Apr 19'17

2
@Afflatus- DataFrames 故意不允许进行真实的比较(除非长度为1),因为它们继承自numpy.ndarray。-credit to stackoverflow.com/a/33307396/994076
Daniel Myers

这是绝对的宝石。
pfabri

124

dic1 == dic2

python docs

为了说明这一点,下面的例子都将返回一个字典等于{"one": 1, "two": 2, "three": 3}

>>> a = dict(one=1, two=2, three=3)
>>> b = {'one': 1, 'two': 2, 'three': 3}
>>> c = dict(zip(['one', 'two', 'three'], [1, 2, 3]))
>>> d = dict([('two', 2), ('one', 1), ('three', 3)])
>>> e = dict({'three': 3, 'one': 1, 'two': 2})
>>> a == b == c == d == e
True

如第一个示例中那样,提供关键字参数仅适用于有效的Python标识符的键。否则,可以使用任何有效的密钥。

py2和有效py3


3
我不同意@ErkinAlpGüney。你能提供证明吗?
齐罗

4
我不同意@ErkinAlpGüney。官方文档显示==确实按值而不是按地址比较字典。docs.python.org/2/library/stdtypes.html#mapping-types-dict
Matthew Nakayama

3
适用于Python 2.7.13
Jesuisme

4
@ankostis:OrderedDict != dict
CONvid19

3
如果这不是真的,您可以提供输入吗?
CONvid19

55

我是python的新手,但最终却做了类似于@mouad的操作

unmatched_item = set(dict_1.items()) ^ set(dict_2.items())
len(unmatched_item) # should be 0

^当两个字典中的所有元素相同时,XOR运算符()应该消除该字典中的所有元素。


28
不幸的是,如果字典中的值是可变的(即不可散列),则此方法将无效。(示例{'a':{'b':1}}给出TypeError: unhashable type: 'dict'
蒂姆·提斯达尔

54

由于似乎没有人提及deepdiff,因此出于完整性考虑,我将在此处添加。我发现通常获取(嵌套)对象的差异非常方便:

安装

pip install deepdiff

样例代码

import deepdiff
import json

dict_1 = {
    "a": 1,
    "nested": {
        "b": 1,
    }
}

dict_2 = {
    "a": 2,
    "nested": {
        "b": 2,
    }
}

diff = deepdiff.DeepDiff(dict_1, dict_2)
print(json.dumps(diff, indent=4))

输出量

{
    "values_changed": {
        "root['a']": {
            "new_value": 2,
            "old_value": 1
        },
        "root['nested']['b']": {
            "new_value": 2,
            "old_value": 1
        }
    }
}

关于漂亮地打印结果以供检查的注意事项:如果两个字典具有相同的属性键(与示例中的属性值可能不同),则上述代码有效。但是,如果存在"extra"属性是dict之一,则json.dumps()失败并显示

TypeError: Object of type PrettyOrderedSet is not JSON serializable

解决方案:使用diff.to_json()json.loads()/ json.dumps()漂亮打印:

import deepdiff
import json

dict_1 = {
    "a": 1,
    "nested": {
        "b": 1,
    },
    "extra": 3
}

dict_2 = {
    "a": 2,
    "nested": {
        "b": 2,
    }
}

diff = deepdiff.DeepDiff(dict_1, dict_2)
print(json.dumps(json.loads(diff.to_json()), indent=4))  

输出:

{
    "dictionary_item_removed": [
        "root['extra']"
    ],
    "values_changed": {
        "root['a']": {
            "new_value": 2,
            "old_value": 1
        },
        "root['nested']['b']": {
            "new_value": 2,
            "old_value": 1
        }
    }
}

替代方案:use pprint,导致格式不同:

import pprint

# same code as above

pprint.pprint(diff, indent=4)

输出:

{   'dictionary_item_removed': [root['extra']],
    'values_changed': {   "root['a']": {   'new_value': 2,
                                           'old_value': 1},
                          "root['nested']['b']": {   'new_value': 2,
                                                     'old_value': 1}}}

2
有趣。感谢您的回答。至少对我有用。这个答案需要更多的投票。
Archit Kapoor,

46

只需使用:

assert cmp(dict1, dict2) == 0

6
看来,任务不仅是检查两者的内容是否相同,而且还需要报告差异
迭戈·泰尔塞罗

29
我相信这与dict1 == dict2
Trey Hunner

10
对于使用Python3.5的人,在cmp建已被删除(和应被视为删除之前他们提出的替代:(a > b) - (a < b) == cmp(a, b)为功能等效(或更好的__eq____hash__
nerdwaller

3
@nerdwaller-字典不是可排序的类型,因此dict_a> dict_b将引发TypeErrorunorderable types: dict() < dict()
Stefano

2
@Stefano:好的,我的评论更多是为了在python中进行一般比较(我没有注意实际的答案,我的错误)。
nerdwaller '16

9

如果您假设两个字典都只包含简单值,则@mouad的答案很好。但是,如果您的字典中包含字典,则您将获得异常,因为字典不可哈希。

在我的头顶上,这样的事情可能会起作用:

def compare_dictionaries(dict1, dict2):
     if dict1 is None or dict2 is None:
        print('Nones')
        return False

     if (not isinstance(dict1, dict)) or (not isinstance(dict2, dict)):
        print('Not dict')
        return False

     shared_keys = set(dict1.keys()) & set(dict2.keys())

     if not ( len(shared_keys) == len(dict1.keys()) and len(shared_keys) == len(dict2.keys())):
        print('Not all keys are shared')
        return False


     dicts_are_equal = True
     for key in dict1.keys():
         if isinstance(dict1[key], dict) or isinstance(dict2[key], dict):
             dicts_are_equal = dicts_are_equal and compare_dictionaries(dict1[key], dict2[key])
         else:
             dicts_are_equal = dicts_are_equal and all(atleast_1d(dict1[key] == dict2[key]))

     return dicts_are_equal

如果您使用not isinstance(dict1, dict)而不是type(dict1) is not dict,则这将适用于基于dict. Also, instead of (dict1 [key] == dict2 [key]), you can do all(atleast_1d(dict1 [key] == dict2 [key]))`的其他类,以至少处理数组。
EL_DON '18

+1,但for loop一旦您dicts_are_equal成为假人,您可能会退出。无需继续进行任何操作。
pfabri

6

直到OP的最后一个注释,还有另一种可能性是比较以JSON格式转储的字典的哈希值(SHAMD)。构造散列的方式可确保如果它们相等,则源字符串也将相等。这是非常快的,并且在数学上是合理的。

import json
import hashlib

def hash_dict(d):
    return hashlib.sha1(json.dumps(d, sort_keys=True)).hexdigest()

x = dict(a=1, b=2)
y = dict(a=2, b=2)
z = dict(a=1, b=2)

print(hash_dict(x) == hash_dict(y))
print(hash_dict(x) == hash_dict(z))

2
完全错误,仅将数据解析为json确实很慢。然后散列您刚刚创建的巨大分支变得更糟。您永远都不应这样做
Bruno

7
@Bruno:引用操作:“速度不是更好,我是在讲代码优雅”
WoJ 2015年

2
它根本不优雅,感觉不安全,并且对于一个非常简单的问题来说过于复杂
Bruno 2015年

7
@布鲁诺:优雅是主观的。我可以理解,您不喜欢它(并且可能被否决了)。这与“错误”不同。
WoJ 2015年

4
这是一个很好的答案。json.dumps(d, sort_keys=True)将为您提供规范的JSON,以便您可以确定两个字典是否等效。这也取决于您要达到的目标。一旦该值不可JSON可序列化,它将失败。因此,谁说它效率低下,请看一下ujson项目。
纳蒂姆

6

IMO的功能很好,清晰直观。但是,为了给您(另一个)答案,这是我的努力:

def compare_dict(dict1, dict2):
    for x1 in dict1.keys():
        z = dict1.get(x1) == dict2.get(x1)
        if not z:
            print('key', x1)
            print('value A', dict1.get(x1), '\nvalue B', dict2.get(x1))
            print('-----\n')

对您或其他任何人都可能有用。

编辑:

我已经创建了上面的一个递归版本。.在其他答案中还没有看到

def compare_dict(a, b):
    # Compared two dictionaries..
    # Posts things that are not equal..
    res_compare = []
    for k in set(list(a.keys()) + list(b.keys())):
        if isinstance(a[k], dict):
            z0 = compare_dict(a[k], b[k])
        else:
            z0 = a[k] == b[k]

        z0_bool = np.all(z0)
        res_compare.append(z0_bool)
        if not z0_bool:
            print(k, a[k], b[k])
    return np.all(res_compare)

2
让我们对其进行改进,使其同时起作用。第2行:“对于set(dict1.keys())。union(dict2.keys())中的x1:”
nkadwa

感谢@nkadwa,它现在执行了
zwep

5

要测试两个字典的键和值是否相等:

def dicts_equal(d1,d2):
    """ return True if all keys and values are the same """
    return all(k in d2 and d1[k] == d2[k]
               for k in d1) \
        and all(k in d1 and d1[k] == d2[k]
               for k in d2)

如果要返回不同的值,请以不同的方式编写:

def dict1_minus_d2(d1, d2):
    """ return the subset of d1 where the keys don't exist in d2 or
        the values in d2 are different, as a dict """
    return {k,v for k,v in d1.items() if k in d2 and v == d2[k]}

您将不得不调用两次,即

dict1_minus_d2(d1,d2).extend(dict1_minus_d2(d2,d1))

3

def equal(a, b):
    type_a = type(a)
    type_b = type(b)
    
    if type_a != type_b:
        return False
    
    if isinstance(a, dict):
        if len(a) != len(b):
            return False
        for key in a:
            if key not in b:
                return False
            if not equal(a[key], b[key]):
                return False
        return True

    elif isinstance(a, list):
        if len(a) != len(b):
            return False
        while len(a):
            x = a.pop()
            index = indexof(x, b)
            if index == -1:
                return False
            del b[index]
        return True
        
    else:
        return a == b

def indexof(x, a):
    for i in range(len(a)):
        if equal(x, a[i]):
            return i
    return -1

测试

>>> a = {
    'number': 1,
    'list': ['one', 'two']
}
>>> b = {
    'list': ['two', 'one'],
    'number': 1
}
>>> equal(a, b)
True

3

现在,与==进行简单比较就足够了(python 3.8)。即使您以不同的顺序比较相同的字典(最后一个示例)。最好的事情是,您不需要第三方程序包即可完成此操作。

a = {'one': 'dog', 'two': 'cat', 'three': 'mouse'}
b = {'one': 'dog', 'two': 'cat', 'three': 'mouse'}

c = {'one': 'dog', 'two': 'cat', 'three': 'mouse'}
d = {'one': 'dog', 'two': 'cat', 'three': 'mouse', 'four': 'fish'}

e = {'one': 'cat', 'two': 'dog', 'three': 'mouse'}
f = {'one': 'dog', 'two': 'cat', 'three': 'mouse'}

g = {'two': 'cat', 'one': 'dog', 'three': 'mouse'}
h = {'one': 'dog', 'two': 'cat', 'three': 'mouse'}


print(a == b) # True
print(c == d) # False
print(e == f) # False
print(g == h) # True

2

迟到总比没有好!

比较Not_Equal比比较Equal更有效。因此,如果在一个字典中没有找到任何键值,则两个字典不相等。下面的代码考虑到您可能会比较默认字典,因此使用get而不是getitem []。

在get调用中使用一种随机值作为默认值,该值等于要检索的键-以防万一dict在一个dict中具有None值,而在另一个dict中不存在该键。同样,在不使用条件之前检查get!=条件的效率,因为您正在同时检查双方的键和值。

def Dicts_Not_Equal(first,second):
    """ return True if both do not have same length or if any keys and values are not the same """
    if len(first) == len(second): 
        for k in first:
            if first.get(k) != second.get(k,k) or k not in second: return (True)
        for k in second:         
            if first.get(k,k) != second.get(k) or k not in first: return (True)
        return (False)   
    return (True)

2

我正在使用此解决方案,该解决方案在Python 3中非常适合我


import logging
log = logging.getLogger(__name__)

...

    def deep_compare(self,left, right, level=0):
        if type(left) != type(right):
            log.info("Exit 1 - Different types")
            return False

        elif type(left) is dict:
            # Dict comparison
            for key in left:
                if key not in right:
                    log.info("Exit 2 - missing {} in right".format(key))
                    return False
                else:
                    if not deep_compare(left[str(key)], right[str(key)], level +1 ):
                        log.info("Exit 3 - different children")
                        return False
            return True
        elif type(left) is list:
            # List comparison
            for key in left:
                if key not in right:
                    log.info("Exit 4 - missing {} in right".format(key))
                    return False
                else:
                    if not deep_compare(left[left.index(key)], right[right.index(key)], level +1 ):
                        log.info("Exit 5 - different children")
                        return False
            return True
        else:
            # Other comparison
            return left == right

        return False

它比较dict,list和任何其他自己实现“ ==”运算符的类型。如果需要比较其他不同的内容,则需要在“ if tree”中添加一个新分支。

希望能有所帮助。


2

对于python3:

data_set_a = dict_a.items()
data_set_b = dict_b.items()

difference_set = data_set_a ^ data_set_b

1
>>> hash_1
{'a': 'foo', 'b': 'bar'}
>>> hash_2
{'a': 'foo', 'b': 'bar'}
>>> set_1 = set (hash_1.iteritems())
>>> set_1
set([('a', 'foo'), ('b', 'bar')])
>>> set_2 = set (hash_2.iteritems())
>>> set_2
set([('a', 'foo'), ('b', 'bar')])
>>> len (set_1.difference(set_2))
0
>>> if (len(set_1.difference(set_2)) | len(set_2.difference(set_1))) == False:
...    print "The two hashes match."
...
The two hashes match.
>>> hash_2['c'] = 'baz'
>>> hash_2
{'a': 'foo', 'c': 'baz', 'b': 'bar'}
>>> if (len(set_1.difference(set_2)) | len(set_2.difference(set_1))) == False:
...     print "The two hashes match."
...
>>>
>>> hash_2.pop('c')
'baz'

这是另一个选择:

>>> id(hash_1)
140640738806240
>>> id(hash_2)
140640738994848

因此,如您所见,这两个ID是不同的。但是丰富的比较运算符似乎可以解决问题:

>>> hash_1 == hash_2
True
>>>
>>> hash_2
{'a': 'foo', 'b': 'bar'}
>>> set_2 = set (hash_2.iteritems())
>>> if (len(set_1.difference(set_2)) | len(set_2.difference(set_1))) == False:
...     print "The two hashes match."
...
The two hashes match.
>>>

1

在PyUnit中,有一种方法可以很好地比较字典。我使用以下两个词典对其进行了测试,它确实可以满足您的需求。

d1 = {1: "value1",
      2: [{"subKey1":"subValue1",
           "subKey2":"subValue2"}]}
d2 = {1: "value1",
      2: [{"subKey2":"subValue2",
           "subKey1": "subValue1"}]
      }


def assertDictEqual(self, d1, d2, msg=None):
        self.assertIsInstance(d1, dict, 'First argument is not a dictionary')
        self.assertIsInstance(d2, dict, 'Second argument is not a dictionary')

        if d1 != d2:
            standardMsg = '%s != %s' % (safe_repr(d1, True), safe_repr(d2, True))
            diff = ('\n' + '\n'.join(difflib.ndiff(
                           pprint.pformat(d1).splitlines(),
                           pprint.pformat(d2).splitlines())))
            standardMsg = self._truncateMessage(standardMsg, diff)
            self.fail(self._formatMessage(msg, standardMsg))

我不建议导入unittest您的生产代码。我的想法是可以重新构建PyUnit中的源以在生产中运行。它使用pprint哪个“漂亮打印”的字典。似乎很容易使此代码适应“生产就绪”的要求。


1

查看字典视图对象:https : //docs.python.org/2/library/stdtypes.html#dict

这样,您可以从dictView1中减去dictView2,它将返回一组在dictView2中不同的键/值对:

original = {'one':1,'two':2,'ACTION':'ADD'}
originalView=original.viewitems()
updatedDict = {'one':1,'two':2,'ACTION':'REPLACE'}
updatedDictView=updatedDict.viewitems()
delta=original | updatedDict
print delta
>>set([('ACTION', 'REPLACE')])

您可以相交,合并,差异(如上所示),对称差异这些字典视图对象。
更好?快点?-不确定,但是是标准库的一部分-这使其具有很大的可移植性


1

下面的代码将帮助您比较python中的字典列表

def compate_generic_types(object1, object2):
    if isinstance(object1, str) and isinstance(object2, str):
        return object1 == object2
    elif isinstance(object1, unicode) and isinstance(object2, unicode):
        return object1 == object2
    elif isinstance(object1, bool) and isinstance(object2, bool):
        return object1 == object2
    elif isinstance(object1, int) and isinstance(object2, int):
        return object1 == object2
    elif isinstance(object1, float) and isinstance(object2, float):
        return object1 == object2
    elif isinstance(object1, float) and isinstance(object2, int):
        return object1 == float(object2)
    elif isinstance(object1, int) and isinstance(object2, float):
        return float(object1) == object2

    return True

def deep_list_compare(object1, object2):
    retval = True
    count = len(object1)
    object1 = sorted(object1)
    object2 = sorted(object2)
    for x in range(count):
        if isinstance(object1[x], dict) and isinstance(object2[x], dict):
            retval = deep_dict_compare(object1[x], object2[x])
            if retval is False:
                print "Unable to match [{0}] element in list".format(x)
                return False
        elif isinstance(object1[x], list) and isinstance(object2[x], list):
            retval = deep_list_compare(object1[x], object2[x])
            if retval is False:
                print "Unable to match [{0}] element in list".format(x)
                return False
        else:
            retval = compate_generic_types(object1[x], object2[x])
            if retval is False:
                print "Unable to match [{0}] element in list".format(x)
                return False

    return retval

def deep_dict_compare(object1, object2):
    retval = True

    if len(object1) != len(object2):
        return False

    for k in object1.iterkeys():
        obj1 = object1[k]
        obj2 = object2[k]
        if isinstance(obj1, list) and isinstance(obj2, list):
            retval = deep_list_compare(obj1, obj2)
            if retval is False:
                print "Unable to match [{0}]".format(k)
                return False

        elif isinstance(obj1, dict) and isinstance(obj2, dict):
            retval = deep_dict_compare(obj1, obj2)
            if retval is False:
                print "Unable to match [{0}]".format(k)
                return False
        else:
            retval = compate_generic_types(obj1, obj2)
            if retval is False:
                print "Unable to match [{0}]".format(k)
                return False

    return retval

3
欢迎使用Stack Overflow!尽管此代码段可以解决问题,但提供说明确实有助于提高您的帖子质量。请记住,您将来会为读者回答这个问题,而这些人可能不知道您提出代码建议的原因。也请尽量不要在代码中加入解释性注释,这会降低代码和解释的可读性!
Filnor

1
>>> x = {'a':1,'b':2,'c':3}
>>> x
{'a': 1, 'b': 2, 'c': 3}

>>> y = {'a':2,'b':4,'c':3}
>>> y
{'a': 2, 'b': 4, 'c': 3}

METHOD 1:

>>> common_item = x.items()&y.items() #using union,x.item() 
>>> common_item
{('c', 3)}

METHOD 2:

 >>> for i in x.items():
        if i in y.items():
           print('true')
        else:
           print('false')


false
false
true

0

在Python 3.6中,可以通过以下方式完成:

if (len(dict_1)==len(dict_2): 
  for i in dict_1.items():
        ret=bool(i in dict_2.items())

如果dict_2中存在dict_1的所有项,则ret变量将为true


0

这是我的答案,使用递归大小方法:

def dict_equals(da, db):
    if not isinstance(da, dict) or not isinstance(db, dict):
        return False
    if len(da) != len(db):
        return False
    for da_key in da:
        if da_key not in db:
            return False
        if not isinstance(db[da_key], type(da[da_key])):
            return False
        if isinstance(da[da_key], dict):
            res = dict_equals(da[da_key], db[da_key])
            if res is False:
                return False
        elif da[da_key] != db[da_key]:
            return False
    return True

a = {1:{2:3, 'name': 'cc', "dd": {3:4, 21:"nm"}}}
b = {1:{2:3, 'name': 'cc', "dd": {3:4, 21:"nm"}}}
print dict_equals(a, b)

希望有帮助!


0

为什么不仅仅遍历一个字典并检查另一个字典(假设两个字典具有相同的键)呢?

x = dict(a=1, b=2)
y = dict(a=2, b=2)

for key, val in x.items():
    if val == y[key]:
        print ('Ok', val, y[key])
    else:
        print ('Not', val, y[key])

输出:

Not 1 2
Ok 2 2

-7
import json

if json.dumps(dict1) == json.dumps(dict2):
    print("Equal")

1
这可能不执行确切要求的操作,并插入了json std lib,但它确实可以工作(json.dumps默认设置是确定性的)。
丹尼尔·法瑞尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.