Seite 1 von 1

Prüfen ob Key / Value in Dictionary

Verfasst: Sonntag 10. Mai 2020, 13:59
von Natrium
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 )

Re: Prüfen ob Key / Value in Dictionary

Verfasst: Sonntag 10. Mai 2020, 15:07
von /me
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).

Re: Prüfen ob Key / Value in Dictionary

Verfasst: Sonntag 10. Mai 2020, 15:09
von kbr
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)

Re: Prüfen ob Key / Value in Dictionary

Verfasst: Sonntag 10. Mai 2020, 15:13
von /me
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()))

Re: Prüfen ob Key / Value in Dictionary

Verfasst: Sonntag 10. Mai 2020, 15:48
von Natrium
/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

Re: Prüfen ob Key / Value in Dictionary

Verfasst: Sonntag 10. Mai 2020, 16:05
von kbr
/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:

Re: Prüfen ob Key / Value in Dictionary

Verfasst: Sonntag 10. Mai 2020, 17:47
von __blackjack__
@/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'}

Re: Prüfen ob Key / Value in Dictionary

Verfasst: Sonntag 10. Mai 2020, 18:01
von /me
__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?

Re: Prüfen ob Key / Value in Dictionary

Verfasst: Sonntag 10. Mai 2020, 18:09
von __blackjack__
@/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.