Difference of list of dictionaries

popcorn :

I've searched quite a lot but I haven't found any similar question to that one.

I have two lists of dictionaries in following format:

data1 = [
    {'id': 4, 'date_time': datetime.datetime(2020, 4, 3, 12, 34, 40)},
    {'id': 4, 'date_time': datetime.datetime(2020, 4, 3, 12, 34, 40)},
    {'id': 6, 'date_time': datetime.datetime(2020, 4, 3, 12, 34, 40)},
    {'id': 7, 'date_time': datetime.datetime(2020, 4, 3, 16, 14, 21)},
]

data2 = [
    {'id': 4, 'date_time': datetime.datetime(2020, 4, 3, 12, 34, 40)},
    {'id': 6, 'date_time': datetime.datetime(2020, 4, 3, 12, 34, 40)},
]

desired output:

final_data = [
    {'id': 4, 'date_time': datetime.datetime(2020, 4, 3, 12, 34, 40)},
    {'id': 7, 'date_time': datetime.datetime(2020, 4, 3, 16, 14, 21)},
]

I want only dictionaries which are in data1 and not in data2.

Until now when I found a match in two for loops I popped the dictionary out of the list but that does not seem like a good approach to me. How can I achieve desired output?

It doesn't have to be time efficient since there will be max tens of dictionaries in each list


Current implementation:

counter_i = 0

for i in range(len(data1)):
    counter_j = 0
    for j in range(len(data2)):
        if data1[i-counter_i]['id'] == data2[j-counter_j]['id'] and data1[i-counter_i]['date_time'] == data2[j-counter_j]['date_time']
            data1.pop(i-counter_i)
            data2.pop(j-counter_j)
            counter_i += 1 
            counter_j += 1 
            break
schwobaseggl :

If performance is not an issue, why not:

for d in data2:
    try:
        data1.remove(d)
    except ValueError:
        pass  

list.remove checks for object equality, not identity, so will work for dicts with equal keys and values. Also, list.remove only removes one occurrence at a time.

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=397989&siteId=1