2017-04-08 19 views
0

私はdictの2つのリストを持っています。Pythonはdictのリストからdictの他のリストの要素を見つける

students = [{'lastname': 'JAKUB', 'id': '92051048757', 'name': 'BAJOREK'}, 
{'lastname': 'MARIANNA', 'id': '92051861424', 'name': 'SLOTARZ'}, {'lastname': 
'SZYMON', 'id': '92052033215', 'name': 'WNUK'}, {'lastname': 'WOJCIECH', 'id': 
'92052877491', 'name': 'LESKO'}] 

そして

house = [{'id_pok': '2', 'id': '92051048757'}, {'id_pok': '24', 'id': '92051861424'}] 

idで辞書マッチングの家のリストに存在しない要素をどのように見つけますか?私はあなたのコードが動作しない理由は、任意のhouse_idがあるかどうないということである

for student in students: 

    for home in house: 

     if student['id'] != home['id']: 

      print student 

しかし、これだけリピートリスト

+1

あなたは何をしようとしたのですか? –

+1

出力にはid 92052033215と92052877491が含まれていると思いますか? – Hackaholic

+0

@Hackaholicはい – lukassz

答えて

1

ことを行う試す

出力

output = [{'lastname': 
'SZYMON', 'id': '92052033215', 'name': 'WNUK'}] 

student_idに一致すると、studentが印刷されます。あなたは、いくつかのより多くのロジックやany機能を必要とするだろう:

for student in students: 
    if not any (student['id'] == home['id'] for home in house): 
     print(student) 

それは出力:

{'lastname': 'SZYMON', 'id': '92052033215', 'name': 'WNUK'} 
{'lastname': 'WOJCIECH', 'id': '92052877491', 'name': 'LESKO'} 

、より効率的なソリューションがhouse_idsのsetを維持し、そのIDではありません学生を見つけることであろうこのセットに含ま:

students = [{'lastname': 'JAKUB', 'id': '92051048757', 'name': 'BAJOREK'}, 
{'lastname': 'MARIANNA', 'id': '92051861424', 'name': 'SLOTARZ'}, {'lastname': 
'SZYMON', 'id': '92052033215', 'name': 'WNUK'}, {'lastname': 'WOJCIECH', 'id': 
'92052877491', 'name': 'LESKO'}] 

house = [{'id_pok': '2', 'id': '92051048757'}, {'id_pok': '24', 'id': '92051861424'}] 

house_ids = set(house_dict['id'] for house_dict in house) 
result = [student for student in students if student['id'] not in house_ids] 

print(result)

出力:

[{'lastname': 'SZYMON', 'id': '92052033215', 'name': 'WNUK'}, {'lastname': 'WOJCIECH', 'id': '92052877491', 'name': 'LESKO'}] 

2人の生徒があなたの説明に一致します。

理由は、setenter link description hereが使用されているのは、リストよりもはるかに高速な検索を可能にするためです。

+0

あなたは 'set'を使う必要はありません。私はIDがユニークでなければならないと思います。 – Hackaholic

+0

セットを使うことは、2つのデータセットの対称差を調べる良い方法です。 –

+0

@Hackaholic:私が 'set'を使う理由はユニークなIDを保証するためではなく、高速な検索ができるからです。リストでは、それははるかに効率的ではありません。 –

0
student_ids = set(d.get('id') for d in students) 
house_ids = set(d.get('id') for d in house) 

ids_not_in_house = student_ids^house_ids 
+0

これは望ましいフォーマットではありませんか? –

+0

私は彼が2と2をまとめる方法を見つけることができると確信しています –

0
students = [{'lastname': 'JAKUB', 'id': '92051048757', 'name': 'BAJOREK'}, 
{'lastname': 'MARIANNA', 'id': '92051861424', 'name': 'SLOTARZ'}, {'lastname': 
'SZYMON', 'id': '92052033215', 'name': 'WNUK'}, {'lastname': 'WOJCIECH', 'id': 
'92052877491', 'name': 'LESKO'}] 

house = [{'id_pok': '2', 'id': '92051048757'}, {'id_pok': '24', 'id': '92051861424'}] 

s = {item['id'] for item in students} 
h = {item['id'] for item in house} 

not_in_house_ids = s.difference(h) 
not_in_house_items = [x for x in students if x['id'] in not_in_house_ids] 
print (not_in_house_items) 

>>>[{'name': 'WNUK', 'lastname': 'SZYMON', 'id': '92052033215'}, {'name': 'LESKO', 'lastname': 'WOJCIECH', 'id': '92052877491'}] 
関連する問題