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 中已知的 資料型別。

更新於: 2023年7月17日

599 次瀏覽

啟動你的 職業生涯

透過完成課程獲得認證

開始學習
廣告