我正在使用解析器的输出,该解析器以嵌套列表的形式输出树。以下是数据示例:
[[['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']]]]]]]]
将其转换为键值的每种方式都会导致列表可持续性错误。有什么想法吗?
答案 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'}}}}