2017-05-11 9 views
1

を使用して、リスト内包表記でリストをサブセットに私はこのようになりますどのサブセットたい辞書の大規模なリストを持っている:どのように別のリスト

first_list = [{'name':'James','gender':'M','address':'California'},{'name':'Tom','gender':'M','address':'California'}, 
{'name':'Jane','gender':'F','address':'Utah'}, 
{'name':'Kim','gender':'F','address':'Wisconsin'}, 
{'name':'Ron','gender':'M','address':'Montana'}] 

私は名前で、別のリストを持っている:

second_list = ['James', 'Tom'] 

最初のリストの '名前'が2番目のリストの一部ではなく、単にJamesとTomの辞書を削除しているリストを取得したいとします。

[{'name':'Jane','gender':'F','address':'Utah'}, 
{'name':'Kim','gender':'F','address':'Wisconsin'}, 
{'name':'Ron','gender':'M','address':'Montana'}] 

私は、リストの内包表記を使用してみましたが、私は、これは異なるリストで動作するとは思わない:

third_list = [x for x in first_list if x['name'] != (y for y in second_list)] 

これは動作しません、最初のリストと同じリストを返します。私の構文は間違っていますか?

+1

'(second_listにおけるyのY)'ジェネレータオブジェクトを作成します。これを他のものと比較すると 'False'となります。代わりに 'x ['name']がsecond_listにない場合は、代わりに' 'name ''を使用することができます。 –

答えて

2

not inをご利用ください。

third_list = [i for i in first_list if i['name'] not in second_list] 

結果あなたのコードは動作しません

[{'address': 'Utah', 'gender': 'F', 'name': 'Jane'}, 
{'address': 'Wisconsin', 'gender': 'F', 'name': 'Kim'}, 
{'address': 'Montana', 'gender': 'M', 'name': 'Ron'}] 
0

(y for y in second_list)x['name']は、それが返されますを意味し、文字列、Falseすべての時間で、発電機であるので、私はあなたが何をしたいと仮定これはです:

>>> first_list = [{'name':'James','gender':'M','address':'California'},{'name':'Tom','gender':'M','address':'California'}, 
... {'name':'Jane','gender':'F','address':'Utah'}, 
... {'name':'Kim','gender':'F','address':'Wisconsin'}, 
... {'name':'Ron','gender':'M','address':'Montana'}] 
>>> 
>>> 
>>> second_list = ['James', 'Tom'] 
>>> 
>>> [x for x in first_list if x['name'] not in second_list] 
[{'gender': 'F', 'name': 'Jane', 'address': 'Utah'}, {'gender': 'F', 'name': 'Kim', 'address': 'Wisconsin'}, {'gender': 'M', 'name': 'Ron', 'address': 'Montana'}] 

メソッドを使用してください:

>>> filter(lambda x:x["name"] not in second_list,first_list) 
[{'gender': 'F', 'name': 'Jane', 'address': 'Utah'}, {'gender': 'F', 'name': 'Kim', 'address': 'Wisconsin'}, {'gender': 'M', 'name': 'Ron', 'address': 'Montana'}] 
0

使用

third_list = [x for x in first_list if x['name'] not in second_list]