user266003
user266003

Reputation:

Filtering a list in Python

Source list of dictionaries

[
    {'main_id': 0, '_id': ObjectId('111111111111111'), 'key1': 'val1'}, 
    {'main_id': 1, '_id': ObjectId('222222222222222'), 'key1': 'val2'}, 
    {'main_id': 1, '_id': ObjectId('333333333333333'), 'key1': 'val3'}, 
    {'main_id': 4, '_id': ObjectId('444444444444444'), 'key1': 'val4'},
    {'main_id': 2, '_id': ObjectId('555555555555555'), 'key1': 'val5'},
]

filtered list of dictionaries

[
    {'main_id': 0, '_id': ObjectId('111111111111111'), 'key1': 'val1'}, 
    {'main_id': 1, '_id': ObjectId('222222222222222'), 'key1': 'val2'}, 
    {'main_id': 2, '_id': ObjectId('555555555555555'), 'key1': 'val3'},
]

I want to get a new list of dictionaries:

[
    {'main_id': 1, '_id': ObjectId('333333333333333'), 'key1': 'val3'}, 
    {'main_id': 4, '_id': ObjectId('444444444444444'), 'key1': 'val4'},
]

in other words, I want a new list to contain values that don't exist in a filtered list. Your ideas?

Upvotes: 1

Views: 107

Answers (3)

pydsigner
pydsigner

Reputation: 2885

Using original data:

# dummy!
ObjectId = str


original = [
    {'main_id': 0, '_id': ObjectId('111111111111111'), 'key1': 'val1'}, 
    {'main_id': 1, '_id': ObjectId('222222222222222'), 'key1': 'val2'}, 
    {'main_id': 1, '_id': ObjectId('333333333333333'), 'key1': 'val3'}, 
    {'main_id': 4, '_id': ObjectId('444444444444444'), 'key1': 'val4'},
    {'main_id': 2, '_id': ObjectId('555555555555555'), 'key1': 'val5'},
]

filtered = [
    {'main_id': 0, '_id': ObjectId('111111111111111'), 'key1': 'val1'}, 
    {'main_id': 1, '_id': ObjectId('222222222222222'), 'key1': 'val2'}, 
    {'main_id': 2, '_id': ObjectId('555555555555555'), 'key1': 'val3'},
]

new_list = [d for d in original if d not in filtered]

print(new_list)

Upvotes: 0

K Z
K Z

Reputation: 30453

One liner:

result = [s for s in original if s not in filtered]

or use filter:

filter(lambda x: x not in filtered, original)

Upvotes: 2

Artsiom Rudzenka
Artsiom Rudzenka

Reputation: 29093

full = [
    {'main_id': 0, '_id': ObjectId('111111111111111'), 'key1': 'val1'}, 
    {'main_id': 1, '_id': ObjectId('222222222222222'), 'key1': 'val2'}, 
    {'main_id': 1, '_id': ObjectId('333333333333333'), 'key1': 'val3'}, 
    {'main_id': 4, '_id': ObjectId('444444444444444'), 'key1': 'val4'},
    {'main_id': 2, '_id': ObjectId('555555555555555'), 'key1': 'val5'},
]
filtered = [
    {'main_id': 0, '_id': ObjectId('111111111111111'), 'key1': 'val6'}, 
    {'main_id': 1, '_id': ObjectId('222222222222222'), 'key1': 'val7'}, 
    {'main_id': 2, '_id': ObjectId('555555555555555'), 'key1': 'val8'},
]

diff = [x for x in full if x not in filtered]

Upvotes: 1

Related Questions