2013-01-08 29 views
0

我想将表示为像这样的列表树结构...转变从列表树结构到Python字典

['access_ctrl_allow', 
['description', ['Access Control - Allow']], 
['type', ['4']], 
['metadata'], 
['output', ['0']], 
['rule', 
    ['0', 
    ['enabled', ['1']], 
    ['action', ['type', ['accept_conn']]], 
    ['match', 
    ['services', 
    ['0', 
     ['name', ['DHCP']], 
     ['trigger', 
     ['0', 
     ['protocol', ['17']], 
     ['dst', ['start', ['67']], ['end', ['67']]], 
     ['src', ['start', ['67']], ['end', ['68']]]]]]]]]]] 

到Python字典,像这样:

{'access_ctrl_allow': {'output': '0', 
    'type': '4', 
    'description': 'Access Control - Allow', 
    'rule': {'0': {'action': {'type': 'accept_conn'}, 
    'enabled': '1', 
    'match': {'services': {'0': {'trigger': {'0': {'src': {'start': '67', 
      'end': '68'}, 
     'dst': {'start': '67', 'end': '67'}, 
     'protocol': '17'}}, 
     'name': 'DHCP'}}}}}, 
    'metadata': {}}} 

我有代码,不会和它似乎产生正确的输出...

def dictify(data): 
    k, v = data[0], data[1:] 

    if len(v) == 0: 
     return {k: {}} 
    elif len(v) == 1 and len(v[0]) == 1: 
     return {k: v[0][0]} 
    else: 
     new = {} 
     for datum in v: 
      new.update(dictify(datum)) 
     return {k: new} 

...但感觉笨重。你能提供任何清理这些的建议吗?特别是,需要对列表中的列表(v[0][0])进行解引用,这意味着我必须有更好的方法。

+1

使用http://meta.codereview.stackexchange.com/代替。这不是一个编程问题,SO不适用于代码评论。 –

+0

这不是一个编程问题?如果我还没有试图自己解决它,这只是一个编程问题吗?如果它能让你快乐,我可以删除我的代码。 – larsks

+0

这里没有问题要解决。您自己说过 - 这适用于输入数据,似乎是一个完全合理的递归方法。它适合您的数据和您的期望。你想要单行吗?它出什么问题了?它是否被确定为瓶颈?无论哪种方式,它都不适合SO。 –

回答

0

如果你愿意接受稍微不同的充输出,您可以使用setdefault

import json 
d={} 
def rec(lst,d): 
    for i in lst: 
     if not isinstance(i,list): 
      child=d.setdefault(i,{}) 
     else: 
      rec(i,child) 
rec(lst,d) 
print json.dumps(d,indent=3) 

出来:

{ 
    "access_ctrl_allow": { 
     "output": { 
     "0": {} 
     }, 
     "type": { 
     "4": {} 
     }, 
     "description": { 
     "Access Control - Allow": {} 
     }, 
     "rule": { 
     "0": { 
      "action": { 
       "type": { 
        "accept_conn": {} 
       } 
      }, 
      "enabled": { 
       "1": {} 
      }, 
      "match": { 
       "services": { 
        "0": { 
        "trigger": { 
         "0": { 
          "src": { 
           "start": { 
           "67": {} 
           }, 
           "end": { 
           "68": {} 
           } 
          }, 
          "dst": { 
           "start": { 
           "67": {} 
           }, 
           "end": { 
           "67": {} 
           } 
          }, 
          "protocol": { 
           "17": {} 
          } 
         } 
        }, 
        "name": { 
         "DHCP": {} 
        } 
        } 
       } 
      } 
     } 
     }, 
     "metadata": {} 
    } 
} 
+0

我的代码的早期版本正好生成了这个输出,但是我对整个值感到不满 - 被表示为键的结果。另一方面,你的代码比我的代码短得多。谢谢! – larsks