这是一种比较任何深度的基本python对象的方法。 排除是元组,因为它一成不变
def sort_all(obj, nochange = False):
if nochange:
obj = obj.copy()
def _key(obj):
if isinstance(obj, dict):
sort_all(obj)
return str({k: obj[k] for k in sorted(obj, key = _key)})
if isinstance(obj, list):
sort_all(obj)
return str(obj)
if isinstance(obj, dict):
for k, v in obj.items():
sort_all(v)
if isinstance(obj, list):
obj.sort(key = _key)
return obj
此功能排序的所有对象的内部列表,以便进行比较变得简单的像,在默认情况
l1 = [{1: 2}, {34: 5, 1: 2}, {2: 3, 'asd': [1, 3, 6, {'b': 55}]}, {4: 3, 'a': {34: 5, 1: 2}}]
l2 = [{2: 3, 'asd': [1, 3, 6, {'b': 55}]}, {4: 3, 'a': {1: 2, 34: 5}}, {1: 2}, {1: 2, 34: 5}]
l1 == l2
False
sort_all(l1)
[{34: 5, 1: 2}, {1: 2}, {2: 3, 'asd': [1, 3, 6, {'b': 55}]}, {4: 3, 'a': {34: 5, 1: 2}}]
sort_all(l2)
[{1: 2, 34: 5}, {1: 2}, {2: 3, 'asd': [1, 3, 6, {'b': 55}]}, {4: 3, 'a': {1: 2, 34: 5}}]
l1 == l2
True
或者干脆
sort_all(l1) == sort_all(l2)
功能改变对象通过,如果你想避免这种情况,请使用nochange = True
l1 = [{1: 2}, {34: 5, 1: 2}, {2: 3, 'asd': [1, 3, 6, {'b': 55}]}, {4: 3, 'a': {34: 5, 1: 2}}]
l2 = [{2: 3, 'asd': [1, 3, 6, {'b': 55}]}, {4: 3, 'a': {1: 2, 34: 5}}, {1: 2}, {1: 2, 34: 5}]
sort_all(l1,nochange=True) == sort_all(l2,nochange=True)
True
l1 == l2
False
您也可以通过这种方式比较类实例,如果他们有str和eq方法实现。例如
class CTest():
def __init__(self, param):
self.attr = param
def __str__(self):
return f"CTest_<{self.attr}>"
def __eq__(self, obj):
if not isinstance(obj, CTest):
return False
return self.attr == obj.attr
l1 = [CTest(1234),{1: 2}, {34: 5, 1: 2}, {2: 3, 'asd': [1, 3, 6, {'b': 55}, CTest(1),]}, {4: 3, 'a': {34: 5, 1: 2}}]
l2 = [{2: 3, 'asd': [1, 3, 6, CTest(1), {'b': 55}]}, {4: 3, 'a': {1: 2, 34: 5}}, {1: 2}, {1: 2, 34: 5},CTest(1234)]
l1 == l2
False
sort_all(l1) == sort_all(l2)
True
预期结果是什么? – RomanPerekhrest
也许你应该在尝试断言之前尝试排序列表?你可以看到assert比较每个列表的第一个元素,它失败,即'{'A':'A1'}!= {'B','B1'}' – AK47
这些不是JSON对象列表,而是组合词和套。 JSON是一种文本格式。 – trincot