Python:基于列表的树到基于dict的树

时间:2014-01-29 00:08:05

标签: python tree key-value

我正在使用解析器的输出,该解析器以嵌套列表的形式输出树。以下是数据示例:

[[['events'], [['worker_connections', '1024']]],
 [['http'],
  [['include', 'mime.types'],
   ['default_type', 'application/octet-stream'],
   ['sendfile', 'on'],
   ['keepalive_timeout', '65'],
   [['server'],
    [['listen', '8080'],
     ['server_name', 'localhost'],
     [['location', '/ '],
      [['root', 'html'], ['index', 'index.html index.htm']]],
     ['error_page', '500 502 503 504 /50x.html'],
     [['location', '= /50x.html '], [['root', 'html']]]]]]]]

将其转换为键值的每种方式都会导致列表可持续性错误。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我觉得数据是明确的。它逻辑上是一个字符串的字典,指向另一个这种字典或字符串。如果键指向dict,则表示为单元素列表,否则表示为字符串。

这当然是部分猜测,但如果我是对的,那么你可以像这样转换它:

def convert(a):
  result = {}
  for e in a:
    if isinstance(e[0], list):  # pointing at dict
      result[e[0][0]] = convert(e[1])
    else:
      result[e[0]] = e[1]
  return result

结果将是

{'events': {'worker_connections': '1024'},
 'http': {'default_type': 'application/octet-stream',
          'include': 'mime.types',
          'keepalive_timeout': '65',
          'sendfile': 'on',
          'server': {'error_page': '500 502 503 504 /50x.html',
                     'listen': '8080',
                     'location': {'root': 'html'},
                     'server_name': 'localhost'}}}

编辑:

我刚看到这会丢弃一些信息(当密钥是列表但不是像['location', '/ ']那样的单元素列表时)。所以我们可以使用元组作为键(它们是可以清除的)并最终在此处:

def convert(a):
  result = {}
  for e in a:
    if isinstance(e[0], list):  # pointing at dict
      result[tuple(e[0])] = convert(e[1])
    else:
      result[e[0]] = e[1]
  return result

产:

{('events',): {'worker_connections': '1024'},
 ('http',): {'default_type': 'application/octet-stream',
             'include': 'mime.types',
             'keepalive_timeout': '65',
             'sendfile': 'on',
             ('server',): {'error_page': '500 502 503 504 /50x.html',
                           'listen': '8080',
                           'server_name': 'localhost',
                           ('location', '/ '): {'index': 'index.html index.htm',
                                                'root': 'html'},
                           ('location', '= /50x.html '): {'root': 'html'}}}}