2012-11-07 102 views
1
字典

源列表在Python过滤列表

[ 
    {'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'}, 
] 

字典

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

我想要得到词典的新列表的过滤列表:

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

,我想要一个新的列表来包含过滤列表中不存在的值。 您的想法?

+2

在你的例子中,过滤的列表不是第一个列表的子集。为什么? – wim

+0

@wim相反,它是。 – pydsigner

+1

我认为'val3'应该是过滤列表中的'val5'? –

回答

3

一个衬里:

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

,或者使用filter

filter(lambda x: x not in filtered, original) 
2
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] 
+0

最好先将“filtered”复制到一个集合中,因为成员资格检查会显着加快。 (显然,这取决于输入的大小以及对性能/内存使用的需求)。 –

+0

啊,CPU与RAM。经典的决斗。 – pydsigner

+0

但它不会让你复制这个设置 - 将抛出字典obj是不可能的。 –

1

使用原始数据:

# 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)