Seite 1 von 1

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

Verfasst: Montag 19. Dezember 2011, 17:45
von fon77
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

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

Verfasst: Montag 19. Dezember 2011, 18:14
von 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.

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

Verfasst: Montag 19. Dezember 2011, 19:35
von fon77
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.