2016-05-03 16 views
1

ich wissen muss, wenn ein dict in einen anderen enthalten ist, 3 in Python rekursiv:Recusively Test, wenn dict in dict enthalten

first = {"one":"un", "two":"deux", "three":"trois" , "sub": { "s1": "sone" }} 
second = {"one":"un", "two":"deux", "three":"trois", "foo":"bar", "sub": { "s1": "sone", "s2": "stwo"}} 

Verwendung von Wörterbuch Ansichten in Test if dict contained in dict beschrieben wie eine sehr schöne Art und Weise ist , behandelt aber keinen Rekursionsfall.

kam ich mit dieser Funktion auf:

def isIn(inside, outside): 
    for k, v in inside.items(): 
     try: 
      if isinstance(v,dict): 
       if not isIn(v, outside[k]): 
        return False 
      else: 
       if v != outside[k]: 
        return False 
     except KeyError: 
      return False 

    return True 

Welche Arbeit:

>>> first.items() <= second.items() 
False 
>>> isIn(first, second) 
True 

Aber gibt es eine bessere (pythonic) Art und Weise?

+0

Wenn das erste Argument leer ist, wird jedes zweites Argument den Test bestehen. Zum Beispiel: 'isIn ({}, 9999) == Wahr '. – FMc

Antwort

1

Hier ist etwas kürzere Version, die nicht try/except und behandelt den Fall benötigt, wo die Parameter verschiedene Art sind:

def isIn(inside, outside): 
    if isinstance(inside, dict) and isinstance(outside, dict): 
     return all(isIn(v, outside.get(k, object())) for k, v in inside.items()) 
    return inside == outside 

print(isIn(first, second)) # True 
print(isIn(second, first)) # False 
print(isIn({}, 9999)) # False 
Verwandte Themen