Search code examples
pythonlistlist-comprehension

python find difference between two list of dictionary


I try to find out the difference between two list of dictionary based on value of certain keys:

test_list1 = [{"name" : "name1", "number": "number1", "data": "data1"}, 
              {"name" : "name2", "number": "number2", "data": "data2"},
              {"name" : "name3", "number": "number3", "data": "data3"},
              {"name" : "name5", "number": "number5", "data": "data5"}]

test_list2 = [{"name" : "name1", "number": "number1", "data": "data5"},
              {"name" : "name2", "number": "number2", "data": "data2"},
              {"name" : "name3", "number": "number3", "data": "data3"},
              {"name" : "name4", "number": "number4", "data": "data4"}]

I try to find out dict with "number" in test_list1 but not in test_list2, for example, {"name" : "name5", "number": "number5", "data": "data5"} is in test_list1 but not in test_list2:

res2 = [i for i in test_list1 for j in test_list2 if i.get("number") != j.get("number")]

the result is:

[{'name': 'name1', 'number': 'number1', 'data': 'data1'}, {'name': 'name1', 'number': 'number1', 'data': 'data1'}, {'name': 'name1', 'number': 'number1', 'data': 'data1'}, {'name': 'name2', 'number': 'number2', 'data': 'data2'}, {'name': 'name2', 'number': 'number2', 'data': 'data2'}, {'name': 'name2', 'number': 'number2', 'data': 'data2'}, {'name': 'name3', 'number': 'number3', 'data': 'data3'}, {'name': 'name3', 'number': 'number3', 'data': 'data3'}, {'name': 'name3', 'number': 'number3', 'data': 'data3'}, {'name': 'name5', 'number': 'number5', 'data': 'data5'}, {'name': 'name5', 'number': 'number5', 'data': 'data5'}, {'name': 'name5', 'number': 'number5', 'data': 'data5'}, {'name': 'name5', 'number': 'number5', 'data': 'data5'}]

how to get the dict with "number" in test_list1 but not in test_list2 as following:

{"name" : "name5", "number": "number5", "data": "data5"}

Solution

  • How about this:

    difference = filter((lambda x: x["number"] not in { y["number"] for y in test_list2}), test_list1)
    difference = list(difference)
    >>>[{'name': 'name5', 'number': 'number5', 'data': 'data5'}]
    

    This will give you a list of course, I don't know if there is only one difference between two lists, but if you think there can only be one difference you can access the dictionary via difference[0]