2016-10-02 95 views
1

我有方法:的Python - 生成父/子字典結構

@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'] 

作爲文檔字符串描述,這種方法可以擴展,以返回任何種類的特定的順序塊。

所以我想做一個映射,指出哪個塊是父母/孩子彼此(只關心「最近」的父母/孩子)。

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 

所以導致如果我們有三個街區像get_blocks方法是這樣的:

{ 
     '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