簡體   English   中英

使用遞歸Python創建嵌套字典

[英]Create a nested dictionary using recursion Python

我試圖圍繞遞歸的工作方式,特別是如何將它分解為子部分並繼續工作,同時保持它全部屬於一個整體部分,如果這有意義的話。

例如:如果給我一個像[1,2,3,4,5]的列表,我想編寫一個在字典中連續創建字典的函數,列表中的每個元素都是關鍵字; 輸出是這樣的 - {1:{2:{3:{4:{5:{}}}}}}。

我知道它可以用一個簡單的for循環來完成,但關鍵是我想學習遞歸是如何工作的。 這是我嘗試過的,我知道它可能相當遙遠。 :(

data = [1,2,3,4,5]
split_order = dict()

def split(data, split_order):
  if len(data) == 0:
      return split_order
  else:
      attr = data[0]
      new_data = data[1:]
      split_order[attr] = dict()
      split_order[attr] = split(new_data, split_order[attr])

你沒有在你的else條款中返回任何else 您也不需要將split_order傳遞給您的函數:

def split(data):
    if data:
        head, *tail = data  # This is a nicer way of doing head, tail = data[0], data[1:]
        return {head: split(tail)}
    else:
        return {}

要理解遞歸是很困難的。 所以為了使它更簡單,我簡化了代碼(我刪除了第二個參數,你不需要它):

def split(data):
  if len(data) == 0:
      return data #trivial case, we have no element therefore we return empty list
  else: #if we have elements
      first_value = data[0] #we take the first value
      data = {first_value : split(data[1:])} #data[1:] will return a list with every value but the first value
      return data #this is called after the last recursion is called

如果你用split[1,2,3,4,5]調用它,它將返回{1: {2: {3: {4: {5: []}}}}}

讓我們看看我們有什么。 我們有一個打破遞歸的部分,這通常被稱為錨(至少在我的語言中)。 我們只是檢查數據是否為空。 你也做了那個部分。

第二部分將提取第一個值並調用拆分但使用較短的列表。 通常這部分將處理提供的數據然后調用自己。 如果數據(列表)不斷變小以便可以在將來的某個時間調用錨,則是有利的。 通常你刪除一個或多個項目。

如果我們通過代碼,我們可以看到重復調用的內容。 如果我們的輸入是[1,2,3]我們調用: split([1,2,3]) -> split([2,3]) -> split([3]) -> split()只有在最后一次調用完成后我們開始返回值(按此順序): [] -> {3: []} -> {2: {3: []}} -> {1: {2: {3: []}}}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM