Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Python过滤列表_Python_Python 3.x - Fatal编程技术网

用Python过滤列表

用Python过滤列表,python,python-3.x,Python,Python 3.x,词典源列表 [ {'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

词典源列表

[
    {'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': 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'},
]
换句话说,我希望一个新列表包含筛选列表中不存在的值。 你的想法?

一行:

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]
result = [s for s in original if s not in filtered]

或使用:

使用原始数据:

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

在您的示例中,筛选列表不是第一个列表的子集。为什么?我认为
val3
应该是过滤列表中的
val5
?可能最好先将
filtered
复制到一个集合中,因为成员资格检查会大大加快。(显然,这取决于输入的大小以及性能/内存使用的需求)。啊,CPU与RAM。经典的决斗。但它不允许你复制到设置-将抛出dict obj是不可破坏的。