2016-10-31 70 views
0

我想獲得一個獲取3個列表並將它們變成嵌套字典的方法。從未知長度的列表中創建一個嵌套的字典

第一個和第二個列表可以有任意數量的條目> 0. 值列表始終有len(firstlist) * len(secondlist)條目。

例如:

givenlist1 = ["First", "Second"] 
givenlist2 = ["A.B.D", "A.Y.Z", "A.B.E"] 
Values = ["10", "2", "3", "4", "1", "3"] 

應該返回一個字典是這樣的:

{'First': {'A': {'B': {'D': '10', 'E': '3'}, 'Y': {'Z': '2'}}}, 
'Second': {'A': {'B': {'D': '4', 'E': '3'}, 'Y': {'Z': '1'}}}} 

我嘗試了很多與.update但我不能得到一個想法如何使用一個變量做第二個列表中的條目數量。

回答

1

您可以使用itertools.product得到的條目所需的組合,givenlist1givenlist2,並使用zip他們從values相應的項目相關聯的。然後您需要.splitgivenlist2項目中的單個字母鍵以獲取嵌套鍵,並根據需要創建新的字典。

from itertools import product 
from pprint import pprint 

givenlist1 = ["First", "Second"] 
givenlist2 = ["A.B.D", "A.Y.Z", "A.B.E"] 
values = ["10", "2", "3", "4", "1", "3"] 

result = {k1: {} for k1 in givenlist1} 

for (k1, k2), v in zip(product(givenlist1, givenlist2), values): 
    d = result[k1] 
    keys = k2.split('.') 
    for k in keys[:-1]: 
     d = d.setdefault(k, {}) 
    d[keys[-1]] = v 

pprint(result) 

輸出

{'First': {'A': {'B': {'D': '10', 'E': '3'}, 'Y': {'Z': '2'}}}, 
'Second': {'A': {'B': {'D': '4', 'E': '3'}, 'Y': {'Z': '1'}}}} 

這裏的寫入內for循環較不緊湊,但可能更可讀的方式:

for k in keys[:-1]: 
    if k not in d: 
     d[k] = {} 
    d = d[k] 
相關問題