Python 中將列表轉換為巢狀字典
列表由元素的有序序列定義,而巢狀字典定義字典包含另一個字典。當我們想要在大型字典中儲存大量資料時,需要巢狀字典。在 Python 中,我們有一些內建函式,如 reduce() 和 zip(),可以將列表轉換為巢狀字典。例如,字典資料傳達資料結構內容,更容易理解。
語法
以下語法在示例中使用:
reduce()
Python 中的這個內建函式遵循 functools 模組來對列表執行特定操作。
zip()
zip() 是 Python 中的一個內建函式,它接受任何型別的引數 - 列表、元組、字典、集合等。
使用 for 迴圈
該程式使用 for 迴圈迭代輸入列表和集合,以將列表轉換為巢狀字典。
示例
在下面的示例中,我們首先建立列表並將其儲存在變數 my_list 中。根據問題陳述,現在我們將建立一個空字典並將其儲存在變數 p_list 中,並且相同的變數再次儲存在變數 emp_dict 中,表示巢狀結構。然後使用 for 迴圈迭代 my_list 中的每個專案。繼續在變數 p_list[item] 中建立新字典,然後將此變數交換到名為 p_list 的變數,這將描繪 Python 中的巢狀字典。最後,我們藉助名為 emp_dict 的變數列印結果。
my_list = ['a', 'b', 'c'] # Nesting structure emp_dict = p_list = {} for item in my_list: p_list[item] = {} p_list = p_list[item] print(emp_dict)
輸出
{'a': {'b': {'c': {}}}}
使用 Functools 模組
需要在系統中安裝以下命令:
pip install functools
該程式使用 functools 庫,該庫具有高級別的內建函式(如 reduce())來解決 Python 中將列表轉換為巢狀字典的問題。
示例
在下面的示例中,首先匯入名為 functools 的包,它將提供內建方法庫()。然後建立列表並將其儲存在變數 P 中。接下來,初始化變數 Q,該變數儲存 reduce() 函式的值,該函式接受兩個引數:
reduce(lambda x, y: {y:x}, Q[::-1]) for Q in P: reduce 函式從左到右迭代列表中的單個值。然後 lambda 函式採用兩個引數 x 和 y,並返回一個字典,其中 y 為鍵,x 為值。'Q[::-1]) for Q in P' 描繪了巢狀字典結構,其中反轉列表的每個結構元素都成為字典中的一個鍵。
最後,我們藉助 Q 列印結果。
# The method name reduce() from functools module() from functools import reduce P = [['P', 'Q', 'R'], ['M', 'N', 'O']] Q = [reduce(lambda x, y: {y:x}, Q[::-1]) for Q in P] print(Q)
輸出
[{'P': {'Q': 'R'}}, {'M': {'N': 'O'}}]
使用字典推導式
該程式使用 for 迴圈進行迭代,並且使用 zip 將建立 Python 中列表的字典轉換。
示例
在下面的示例中,我們將首先在各自的變數中建立三個列表 - t1、t2 和 t3。然後藉助鍵值對(即 a、b、c)建立字典的結構,這將表示使用 for 迴圈和內建方法 zip() 相對於變數 t1、t2 和 t3 的巢狀字典的形成。此過程稱為字典推導式,並將其儲存在變數 result 中。最後,我們藉助變數 result 列印輸出。
t1 = ['Letter', 'Word', 'Number'] t2 = ['A', 'Box', 'Integer'] t3 = [1, 3, 41905] # create the nested dictionary by using dictionary comprehension result = {a: {b: c} for (a, b, c) in zip(t1, t2, t3)} print("The nesting dictionary: ", result)
輸出
The nesting dictionary: {'Letter': {'A': 1}, 'Word': {'Box': 3}, 'Number': {'Integer': 41905}}
使用遞迴
該程式使用任意深度來處理將列表轉換為巢狀字典的問題。任意深度與字典推導式的行為類似。這裡它將使用遞迴技術,稱為函式自身呼叫函式。
示例
在下面的示例中,程式以遞迴 Python 開頭,它接受兩個引數 - lst(設定列表)和 d(將預設值設定為 0)。然後它將使用 if 語句檢查整數 d 是否小於列表長度(即 len(lst)),如果發現小於,則返回空字典。接下來,該函式透過使用 字典推導式、if 語句和 for 迴圈返回巢狀字典的結果。然後建立列表並將其儲存在變數 my_lst 中。現在呼叫名為 my_dict 的函式,該函式將變數 my_lst 作為引數傳遞並存儲在變數 result 中。最後,藉助變數 result 列印輸出。
def my_dict(lst, d=0): # if-statement to check condition and return of nested dictionary if d > len(lst): return {} return {a[d]: my_dict([x for x in lst if x[d] == a[d]], d+1) for a in lst} my_lst = [['a', 'b', 'c'], ['d', 'e', 'f']] result = my_dict(my_lst) print("List to Nested Dictionary:\n", result)
輸出
List to Nested Dictionary: {'a': {'b': {}}, 'd': {'e': {}}}
結論
我們探討了四種不同的方法來解決基於將列表轉換為 Python 中的巢狀字典的問題陳述。最後一個示例與所有其他示例略有不同,因為它使用任意深度方法顯示列表和巢狀字典的輸出,而前三個輸出僅顯示巢狀字典。列表和字典是 Python 中已知的 資料型別。