List Comprehension (oder ähnliches) hier möglich?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
fon77
User
Beiträge: 17
Registriert: Freitag 10. April 2009, 20:58

Hallo Forum,

ich frage mich gerade, ob es für dieses Problem eine elegantere Lösung gibt (wie eine Art List Comprehension) als das übliche 2-for-Schleifen-plus-if-Abfrage Gemauschel. Vielleicht fällt euch ja was ein.

Ich habe zwei Listen, die jeweils Dictionaries enthalten.

Code: Alles auswählen

list_one = [{key_a: 'value1', key_b: 'value2'}, {key_a: 'value3', key_b: 'value4'}, ...]
list_two = [{key_a: 'value1', key_b: 'value3'}, {key_a: 'value3', key_b: 'value4'}, ...]
Nun möchte ich eine Liste mit den Dictionaries bekommen, bei denen der Wert von 'key_b' in Liste A enthalten ist, aber nicht in Liste B.

Beim Beispiel oben soll das Resultat also sein:

Code: Alles auswählen

result = [{key_a: 'value1', key_b': 'value3'}]
... da das Dictionary mit key_b = value4 in list_one und list_two enthalten ist, und damit rausfliegt. Also im Endeffekt eine Art Mengenoperation (list_one - list_two), bei der der Identifikator für das Element der Wert von key_b ist.

Geht das irgendwie geschickter als mit for und if-Orgien? Ich hoffe ich habe mich halbwegs klar ausgedrückt. :)

Danke schonmal
Frank
BlackJack

Mengenoperation ist das Stichwort für `set`\s:

Code: Alles auswählen

In [152]: xs = set(x[key_b] for x in list_one)

In [153]: [x for x in list_two if x[key_b] not in xs]
Out[153]: [{'key_a': 'value1', 'key_b': 'value3'}]
Hier wird jede der beiden Listen nur einmal durchlaufen.
fon77
User
Beiträge: 17
Registriert: Freitag 10. April 2009, 20:58

Ah danke, das werd ich mal ausprobieren. Mit Sets hatte ich tatsächlich schon experimentiert, bekam aber einen Fehler - irgendwas mit 'dictionaries are not hashable' oder so ähnlich, und hatte das dann wieder verworfen.
Antworten