2016-12-07 79 views
0

我有下面的代碼,它必須將這個元組如何優化蟒蛇遞歸

(
    'person.firstname', 
    'person.patronymic', 
    'person.documents.type', 
    'person.documents.number', 
    'person.employee_set.unit.short_name', 
    'person.employee_set.group_set.name', 
    'person.employee_set.group_set.period.code', 
    'unit.short_name', 
) 

到字典中類似這樣的

{ 
    "person": { 
     "patronymic": {}, 
     "documents": { 
      "type": {}, 
      "number": {} 
     }, 
     "employee_set": { 
      "unit": { 
       "short_name": {} 
      }, 
      "group_set": { 
       "name": {}, 
       "period": { 
        "code": {} 
       } 
      } 
     }, 
     "firstname": {} 
    }, 
    "unit": { 
     "short_name": {} 
    } 
} 

代碼:

def to_dict(items): 
    di = {} 
    for item in items: 
     parse(di, item) 
    return di 


def parse(di, item): 
    sep = item.find('.') 
    if sep != -1: 
     key = item[:sep] 
     if not key in di.keys(): 
      di[key] = {} 
     return parse(di[key], item[sep + 1:]) 
    elif len(item) > 0: 
     di[item] = {} 
     return di 

是可能的優化此代碼無遞歸?據我瞭解它有尾遞歸,但我不明白如何將其轉換成循環

+0

你可以看看這個帖子 - HTTP ://stackoverflow.com/a/33327123/5352399 –

回答

2

我重寫了函數而不遞歸。

def to_dict(items): 
    res = {} 
    for item in items: 
     parts = item.split('.') 
     dest = res 
     for part in parts: 
      if not part in dest: 
       dest[part] = {} 
      dest = dest[part] 
    return res 

to_dict([ 
    'person.firstname', 
    'person.patronymic', 
    'person.documents.type', 
    'person.documents.number', 
    'person.employee_set.unit.short_name', 
    'person.employee_set.group_set.name', 
    'person.employee_set.group_set.period.code', 
    'unit.short_name', 
]) 

的alorithm:我的每一條路徑分成了部分,然後建立一個循環subdicts保持基準dest字典的部分目前我在

+0

謝謝。我在本週學習編程,並且你對我的幫助很大。 – DexFuris