2016-10-02 47 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