2017-09-25 58 views
0

我是python中的新手。请给我一个建议。 我有两个JSON对象的列表。如何在列表中对字典对象进行排序,以便在python中比较这些列表3

list1 = [{"A":"A1"},{"B":"B1"}] 
list2 = [{"B":"B1"}, {"A":"A1"}] 

我需要这些名单在我的测试比较:

我尝试用assert做到这一点:

assert list1 == list2 

但我得到以下几点:

E AssertionError:

assert [{'A': 'A1'}, {'B', 'B1'}] == [{'B', 'B1'}, {'A': 'A1'}] 

E At index 0 diff: {'A': 'A1'} != {'B', 'B1'}

如何我可以在比较这些列表之前对对象列表进行排序?

+0

预期结果是什么? – RomanPerekhrest

+0

也许你应该在尝试断言之前尝试排序列表?你可以看到assert比较每个列表的第一个元素,它失败,即'{'A':'A1'}!= {'B','B1'}' – AK47

+2

这些不是JSON对象列表,而是组合词和套。 JSON是一种文本格式。 – trincot

回答

0

谢谢,伙计们。我找到了解决方案: list1 = [{“name”:“David”,“age”:“25”},{“name”:“John”,“age”:“30”}] list2 = { “名”: “约翰”, “年龄”: “30”},{ “名”: “万人迷”, “年龄”: “25”}]

 sorted_list1 = sorted(list1, key = lambda item:item["name"]) 
     sorted_list2 = sorted(list2, key = lambda item:item["name"]) 
     assert sorted_list1 == sorted_list2 

它的工作原理。

0

这是一种比较任何深度的基本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 

您也可以通过这种方式比较类实例,如果他们有streq方法实现。例如

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 
+0

非常感谢 – Viola

相关问题