A = {
    'a': 1,
    'b': 2,
    'c': 3
}

B = {
    'a': 1,
    'b': 2,
    'c': 3,
    'd': 4
}

Mein Ziel ist es zu überprüfen, ob A ein "Unterwörterbuch" von B ist. Damit meine ich jedes Schlüsselpaar: Wert in A ist in B. Hier ist mein Versuch

def is_sub_dict(first_dict, second_dict):
    for x in first_dict:
        if x not in second_dict or first_dict[x] != second_dict[x]:
            return False
    return True

is_sub_dict(A, B) #True
is_sub_dict(B, A) #False

Gibt es einen besseren Weg, dies zu tun? Oder vielleicht eine pythonischere Art, weil dies sicher nicht so scheint.

3
thithien 18 Apr. 2018 im 19:01

3 Antworten

Beste Antwort

Erstellen Sie ein set aus Diktat-Tupeln und testen Sie dann, ob die Menge eine Teilmenge der anderen Element-Tupel ist

def is_subset(A,B):
   return set(A.items()).issubset(B.items())

Einmal erstellt, garantiert set eine sehr schnelle Suche.

(Wenn der Vorgang mit demselben A wiederholt werden muss, ist es besser, set(A.items()) für eine bessere Leistung "zwischenzuspeichern".)

Dies funktioniert, weil die Werte der Wörterbücher hashbar sind. Wenn dies nicht der Fall ist, ist die gute alte all(x in y for ...) -Methode eine weitere Option (siehe andere Antworten).

8
Jean-François Fabre 18 Apr. 2018 im 16:22

Wie wäre es mit:

def is_subset(a, b):
    return all(item in b for item in a)

Und dann einfach:

if is_subset(A.items(), B.items()):
   # ...
4
Matias Cicero 18 Apr. 2018 im 16:05

Überprüfen Sie dies aus

all(item in B.items() for item in A.items())

Hoffe es wird dir helfen !!

4
py-D 18 Apr. 2018 im 16:04