2014-01-29 48 views
0

我正在使用以嵌套列表的形式輸出樹的解析器的輸出。以下是一個數據示例:Python:基於列表的樹到詞典樹

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

你能表現出同樣的數據基於字典樹,所以我們可以看到它應該被構造?我非常肯定我的理解,但它可能是含糊的 – mhlester

+3

FYI我編輯你的問題使用'pprint'使其可讀。而且我現在更不確定你想要什麼 – mhlester

+0

我有這樣的感覺,即數據是毫不含糊的。從邏輯上講,這是一個字符串的字典,可以指向另一種字典或字符串。如果鍵指向字典,則表示爲單元素列表,否則表示爲字符串。我認爲轉換它可以是自動的。 – Alfe

回答

0

我有一種感覺,數據是明確的。從邏輯上講,這是一個字符串的字典,可以指向另一種字典或字符串。如果鍵指向字典,則表示爲單元素列表,否則表示爲字符串。

這部分是猜測,當然,但如果我是正確的,那麼你可以將其轉換是這樣的:

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'}}}} 
+0

太棒了。謝謝。事實證明,我並沒有從他們的列表中拉出單個項目鍵,然後嘗試將它們用作鍵。 – tengbretson