Prüfen ob Key / Value in Dictionary

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
Natrium
User
Beiträge: 15
Registriert: Montag 13. April 2020, 16:13

Moin Moin,
Ich muss leider noch einmal stören heute - bin jetzt beim Programmieren auf ein weiteres Problem gestoßen.
Ich habe ein Dictionary und möchte prüfen, ob ein Wert entweder als Key oder als Value im Dict. enthalten ist.

Dictionary:

Code: Alles auswählen

hans = { "A" : ["B","C","E","F"],
          "B" : ["D", "E"],
          "C" : ["F", "D"],
          "E" : [],
          "F" : []
        }
Sinnigerweise habe ich mir überlegt, aus den Items eine einzelne Liste zu machen und dann zu prüfen, ob der Wert enthalten ist.

Meine bisherigen Versuche

Versuch 1.

Code: Alles auswählen

from functools import reduce
b= list(reduce(lambda x, y: x + y, hans.items()))
print(b)
print ("D" in b)
Ausgabe:

Code: Alles auswählen

['A', ['B', 'C', 'E', 'F'], 'B', ['D', 'E'], 'C', ['F', 'D'], 'E', [], 'F', []]
False
Versuch 2.

Code: Alles auswählen

liste = []
for k,v in hans.items():
    liste.append(k)
for k,v in hans.items():
    liste.append(v)

print (liste)
print("D" in liste)
Ausgabe:

Code: Alles auswählen

['A', 'B', 'C', 'E', 'F', ['B', 'C', 'E', 'F'], ['D', 'E'], ['F', 'D'], [], []]
False

Wenn ich prüfe, ob z.B. "A" enthalten ist, bekomme ich ein "True" zurück - Wenn der Wert allerdings in der verschachtelten Liste ist, wie das "D", immer ein False.

Wäre sehr nice, wenn jemand einen Rat hat, wie ich aus dem Dict. eine einfache Liste erzeugen kann.

Thanks im Voraus )
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Natrium hat geschrieben: Sonntag 10. Mai 2020, 13:59

Code: Alles auswählen

liste = []
for k,v in hans.items():
    liste.append(k)
for k,v in hans.items():
    liste.append(v)
Du solltest dir mal den Unterschied zwischen den Methoden append und extend ansehen (Data Structures - More on Lists).
Zuletzt geändert von /me am Sonntag 10. Mai 2020, 15:10, insgesamt 1-mal geändert.
Benutzeravatar
kbr
User
Beiträge: 1508
Registriert: Mittwoch 15. Oktober 2008, 09:27

In den keys kannst Du direkt suchen, die values musst Du zuvor "flatten", da diese Listen sind. Sei struct Deine Datenstruktur:

Code: Alles auswählen

search_value = 'B'
print(f'{search_value} in keys:', search_value in struct.keys())
values = [element for value in struct.values() for element in value]
print(f'{search_value} in values:', search_value in values)
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

kbr hat geschrieben: Sonntag 10. Mai 2020, 15:09

Code: Alles auswählen

values = [element for value in struct.values() for element in value]
Grundsätzlich sollte man natürlich ein set nehmen. Außerdem mag ich itertools. :D

Code: Alles auswählen

values = set(itertools.chain(*struct.values()))
Natrium
User
Beiträge: 15
Registriert: Montag 13. April 2020, 16:13

/me hat geschrieben: Sonntag 10. Mai 2020, 15:07
Natrium hat geschrieben: Sonntag 10. Mai 2020, 13:59

Code: Alles auswählen

liste = []
for k,v in hans.items():
    liste.append(k)
for k,v in hans.items():
    liste.append(v)
Du solltest dir mal den Unterschied zwischen den Methoden append und extend ansehen (Data Structures - More on Lists).
Oh man - schon wieder viel einfacher als gedacht.. mit extend klappt es reibungslos.

Danke euch beiden für die Antworten und allerseits ein schönes Wochenende )

Greetz
Benutzeravatar
kbr
User
Beiträge: 1508
Registriert: Mittwoch 15. Oktober 2008, 09:27

/me hat geschrieben: Sonntag 10. Mai 2020, 15:13 Grundsätzlich sollte man natürlich ein set nehmen. Außerdem mag ich itertools. :D
itertools mag ich auch. Und sets sind auch prima, aber wer weiß, was da später alles als value vorhanden sein wird. Vielleicht sind die ja gar nicht hashable... :wink:
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@/me: Ich hätte da `chain.from_iterables()` statt dem * beim Aufruf genommen.

@all: `more_itertools` hat mit `collapse()` auch etwas wo man Schlüssel *und* Werte ”flach” bekommt:

Code: Alles auswählen

In [219]: data                                                                  
Out[219]: {'A': ['B', 'C', 'E', 'F'], 'B': ['D', 'E'], 'C': ['F', 'D'], 'E': [], 'F': []}

In [220]: set(more_itertools.collapse(data.items()))                            
Out[220]: {'A', 'B', 'C', 'D', 'E', 'F'}
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

__blackjack__ hat geschrieben: Sonntag 10. Mai 2020, 17:47 @/me: Ich hätte da `chain.from_iterables()` statt dem * beim Aufruf genommen.
Hatte ich auch erst da stehen, aber irgendwie bin ich so an die andere Methode gewöhnt. Was besser lesbar ist, ist sicher diskutabel, aber macht das in der Praxis einen Unterschied in der Ausführung?
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@/me: Die *-Syntax beim Aufruf macht da tatsächlich eine Liste draus, während `chain.from_iterables()` ”lazy” über die Elemente iteriert. Macht in der Praxis wahrscheinlich nur bei recht grossen Wörterbüchern einen Unterschied.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten