2016-05-03 107 views
1

我需要知道,如果一個字典包含到另外一個,遞歸,在Python 3字典:像Test if dict contained in dict描述的字典視圖Recusively測試是否包含在字典

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

用法是一個非常好的方式,但不處理遞歸情況。

我想出了這個功能:

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 

哪些工作:

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

但有一個更好的(更Python)的方式?

+0

如果第一個參數是空的,任何第二個參數將通過測試。例如:'isIn({},9999)== True'。 – FMc

回答

1

這裏的一個位較短的版本其不需要try/except並處理其中的參數是不同的類型的情況下:

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 
相關問題