2016-08-06 4 views
-2

たとえば、入れ子にされたdictがあるとします。この辞書の最低のキーレベル(葉)でPythonの葉ノードでネストされたdictがFalseであるかどうかを確認します

{'agent1': {'status': True}, 
'block1': {'status': True, 'number': False, 'usable_by': True, 'location': True, 'skill': 
       {'speed': False, 'flexibility': True}}} 

以下、値はブール値(TrueまたはFalse)です。入力dictは基本的に、キーと異なる名前の固定された深さを持たない任意の種類のネストされた構造を持つことができます。

特定のdictにFalseがあるかどうかを、一般的に確認するにはどうすればよいですか。

+0

は、固定された深さのネストされたdictのですか?そうでなければ、すべての「リーフ」ノードがブール値であると仮定していますか? – theorifice

+0

固定深さなし、すべての葉ノードはブーリアンです。私は詳細をつけて質問を編集しました – eljobso

+0

'False'値に対応するキーがあればそれを知る必要がありますか? – theorifice

答えて

1

あなたは辞書を横断する必要があるだろう、とあなたは早期を終了したい:

def any_false_leaf(d): 
    if isinstance(d, dict): 
     return any(any_false_leaf(v) for v in d.values()) 
    return not d 

この再帰があなたの辞書を通じて、構造中にネストされた偽の値がある場合Trueを返します。 。 any() functiongenerator expressionを使用すると、そのような値が見つかるとすぐに結果が生成されることが保証されます。

デモ:

>>> d = {'agent1': {'status': True}, 
... 'block1': {'status': True, 'number': False, 'usable_by': True, 'location': True, 'skill': 
...     {'speed': False, 'flexibility': True}}} 
>>> any_false_leaf(d) 
True 
>>> any_false_leaf({'foo': True}) 
False 
>>> any_false_leaf({'foo': {'bar': True}}) 
False 
>>> any_false_leaf({'foo': {'bar': True, 'spam': False}}) 
True 
1

ネストしたdictをトラバースするには、再帰を使用できます。見る(Loop through all nested dictionary values?

def contains_false(d): 
    for k,v in d.iteritems(): 
     if isinstance(v, dict): 
      # recurse into nested-dict 
      if contains_false(v): 
       return True 

     # Check value of leaf-node. Exit early 
     # if we find a 'False' value. 
     if v is False: 
      return True 

    # no 'False' values found 
    return False 

>>> d = {1:True, 2:{1:True, 2:True}, 3:{1:True, 2:True, 3:{1:False}}} 
>>> contains_false(d) 
True 
>>> d[3][3][1] = True 
>>> contains_false(d) 
False 

これは、あなたが「偽」値に到達するためのキー(複数可)を知る必要がないと仮定しています。

0

迅速な解決にはなります

d = {'block1': {'status': True, 'usable_by': True, 'skill': {'flexibility': True, 'speed': False}, 'number': False, 'location': True}, 'agent1': {'status': True}} 

values = [] 

def find_false(d): 
    for k in d.keys(): 
     if isinstance(d[k], dict): 
      find_false(d[k]) 
     else: 
      values.append(d[k]) 

find_false(d) 
print(False in values) 

は、この情報がお役に立てば幸いです。

関連する問題