2016-10-02 4 views
1

私は方法があります。パイソン - 生成する親/子dictの構造

@staticmethod 
def get_blocks(): 
    """Public method that can be extended to add new blocks. 

    First item is the most parent. Last item is the most child. 
     Returns: 
      blocks (list) 
    """ 
    return ['header', 'body', 'footer'] 

ドキュメンテーション文字列が記述したように、この方法は、特定の順序でブロックの任意の種類を返すために、拡張することができます。

どのブロックが親子関係にあるかを示すマッピングを作成したいと思います(「最も近い」親子関係のみを気にする)。我々はget_blocks方法でのように三つのブロックを持っている場合

def _get_blocks_mapping(blocks): 
    mp = {'parent': {}, 'child': {}} 
    if not blocks: 
     return mp 
    mp['parent'][blocks[0]] = None 
    mp['child'][blocks[-1]] = None 
    blocks_len = len(blocks) 
    if blocks_len > 1: 
     mp['parent'][blocks[-1]] = blocks[-2] 
     for i in range(1, len(blocks)-1): 
      mp['parent'][blocks[i]] = blocks[i-1] 
      mp['child'][blocks[i]] = blocks[i+1] 
    return mp 

その結果、このです:

{ 
     'parent': { 
      'header': None, 
      'body': 'header', 
      'footer': 'body', 
     }, 
     'child': { 
      'header': 'body', 
      'body': 'footer', 
      'footer': None 
     } 
    } 

まあそれは動作しますが、それは一種のハック私にはあります。だから、誰かがこのようなマッピングを作成するより良い方法を提案するかもしれません? (?または多分、私が使用するつもりは異なる構造を使用して、親/子のマッピングを作成するためのいくつかの使用方法がある?)

答えて

1

あなたがペアでリストをループにしたい、あなたの自然な親子関係を与える:

mp = {'parent': {}, 'child': {}} 
if blocks: 
    mp['parent'][blocks[0]] = mp['child'][blocks[-1]] = None 
    for parent, child in zip(blocks, blocks[1:]): 
     mp['parent'][child] = parent 
     mp['child'][parent] = child 

zip()は、各ブロックをリスト内の次のブロックとペアにします。

デモ:

>>> blocks = ['header', 'body', 'footer'] 
>>> mp = {'parent': {}, 'child': {}} 
>>> if blocks: 
...  mp['parent'][blocks[0]] = mp['child'][blocks[-1]] = None 
...  for parent, child in zip(blocks, blocks[1:]): 
...   mp['parent'][child] = parent 
...   mp['child'][parent] = child 
... 
>>> from pprint import pprint 
>>> pprint(mp) 
{'child': {'body': 'footer', 'footer': None, 'header': 'body'}, 
'parent': {'body': 'header', 'footer': 'body', 'header': None}} 
+0

感謝。これはよりエレガントに見えます。 – Andrius

関連する問題