2017-12-02 174 views
0

變換列表我想知道它有可能創建一個轉換此列表的功能:在數據結構

['music\n', ' extension=mp3\n', '\n', 'reports/INFOB131\n', ' extension=doc,docx,pdf\n', ' name_contains=INFOB131\n', ' max_size=100000\n', '\n', 'reports/INFOB132\n', ' extension=doc,docx,pdf\n', ' name_contains=INFOB132\n', ' max_size=100000\n', '\n', 'games\n', ' name_contains=SC2,Wesnoth\n', '\n', 'pictures/Namur\n', ' extension=jpeg\n', ' min_size=5000000\n', ' name_contains=cercle\n', '\n', 'pictures/autres\n', ' extension=jpeg\n', ' min_size=5000000'] 

已經從使用readlines方法()函數的文本文件得到。

到數據結構像這樣的:

data_config = [{'music' : {'extension':'mp3'}}, {'reports/INFOB131': {'extension': ['doc', 'docx','pdf'], 'name_contains':'INFOB131', 'max_size':100000}}, {'reports/INFOB132': {'extension': ['doc', 'docx','pdf'], 'name_contains':'INFOB132', 'max_size':100000}}] 

我開始通過這些過程,以清理名單:

new_lines = [] 
for i in lines : 
    new_lines.append(str.strip(i, '\n')) 

for i in new_lines: 
    if i == '': 
    new_lines.remove(i) 

我得到這樣的:

['music', ' extension=mp3', 'reports/INFOB131', ' extension=doc,docx,pdf', ' name_contains=INFOB131', ' max_size=100000', 'reports/INFOB132', ' extension=doc,docx,pdf', ' name_contains=INFOB132', ' max_size=100000', 'games', ' name_contains=SC2,Wesnoth', 'pictures/Namur', ' extension=jpeg', ' min_size=5000000', ' name_contains=cercle', 'pictures/autres', ' extension=jpeg', ' min_size=5000000'] 

接下來,理論上我有這樣的想法:

創建一個將在列表中瀏覽的函數,如果「=」不在列表的元素中,則將其定義爲變量k。否則,該列表的元素將被添加到列表名爲pre_list和直到另外一個元素沒有「=」,在沒有遇到過,這pre_list進行更新,然後當新元素「=」,在它遇到一個字典containig變量鍵作爲列表,pre_list是分配給該鍵的元素。

def my_function(list_in_question, my_config_list =[]): 
""" """ 
for i in list_in_question : 

    #it misses the first if for the situation in which the function stops 
    if not '=' in i: 
     my_config_list.append({key:pre_list}) 
     i = key 
     pre_dict = {key:{}} 

    else: 
     pre_dict[key][i.split('=')[0]] = i.split('=')[1] 

     return myfunction(list_in_question[list_in_question.index(i):]) 

我想以遞歸的方式創建它。我有問題。其中之一是,我不知道我將如何阻止它...

+0

是的,它是posibble。你嘗試了什麼? – furas

+0

提出您嘗試的代碼,如果出現任何錯誤,請提供完整的錯誤消息(Traceback)。 – furas

+0

我能想到的唯一代碼就是我在答案部分寫下的代碼,我想不出別的什麼。 – Manoa

回答

0

問題比我預期的更復雜。
現在很難解釋所有的代碼。
它適用於當前數據,但我不確定它是否可以與其他數據一起使用。

data = ['music\n', ' extension=mp3\n', '\n', 'reports/INFOB131\n', ' extension=doc,docx,pdf\n', ' name_contains=INFOB131\n', ' max_size=100000\n', '\n', 'reports/INFOB132\n', ' extension=doc,docx,pdf\n', ' name_contains=INFOB132\n', ' max_size=100000\n', '\n', 'games\n', ' name_contains=SC2,Wesnoth\n', '\n', 'pictures/Namur\n', ' extension=jpeg\n', ' min_size=5000000\n', ' name_contains=cercle\n', '\n', 'pictures/autres\n', ' extension=jpeg\n', ' min_size=5000000'] 

config_list_2 = [] 

# variable for dictionary 
prev_ext = None 
curr_ext = '' 
prev_list = list() 
prev_dict = dict() 

for item in data: 

    # remove spaces, tabs and '\n' 
    item = item.strip() 

    # create dictionary and sometimes new sublist 
    if not item: 
     if (prev_ext is not None) and curr_ext != prev_ext: 
      config_list_2.append(prev_list) 
      prev_list = list() 
     prev_list.append(prev_dict) 
     prev_dict = dict() 
     prev_ext = curr_ext 
     curr_ext = '' 

    # work only with elements `key=value` 
    if '=' in item: 

     # split `key=value` 
     key, value = item.split('=') 

     # if value has `,` then it is list of values 
     if ',' in value: 
      value = value.split(',') 

     # if you get `extension then you have start new dictionary 
     if key == 'extension': 
      curr_ext = value 

     # some values have to be converted to int() 
     if key in ('max_size', 'min_size'): 
      value = int(value) 

     # add to current dictionary 
     prev_dict[key] = value 

# add last dictionary 

if (prev_ext is not None) and curr_ext != prev_ext: 
    config_list_2.append(prev_list) 
    prev_list = list() 
prev_list.append(prev_dict) 

# add last sublist 

config_list_2.append(prev_list) 

# --- print result --- 

print(config_list_2) 

# --- compare with expected result -- 

expected = [[{'extension' : 'mp3'}], [{'extension':['doc','docx', 'pdf'], 'name_contains':'INFOB131', 'max_size':100000}, {'extension':['doc','docx', 'pdf'], 'name_contains':'INFOB132', 'max_size':100000}],[{'name_contains':['SC2','Wesnoth']}],[{'extension':'jpeg', 'min_size':5000000, 'name_contains':'cercle'}, {'extension':'jpeg', 'min_size':5000000}]] 

print(config_list_2 == expected) # True 
+0

謝謝你,我非常樂意幫助你,看看它是否適合我的功課!真的非常感謝你的時間! – Manoa