我有一個檔案夾,里面有這樣命名的檔案
Max_1.wav
Max_2.wav
Max_3.wav
Toto_1.wav
Toto_2.wav
Toto_3.wav
Valtteri_1.wav
Valtteri_2.wav
Valtteri_3.wav
我想達到這個結果
dict = {
'Max': {
'Max_1': {'path': 'database/Max_1.wav'},
'Max_2': {'path': 'database/Max_2.wav'},
'Max_3': {'path': 'database/Max_3.wav'}
},
'Toto': {
'Toto_1': {'path': 'database/Toto_1.wav'},
'Toto_2': {'path': 'database/Toto_2.wav'},
'Toto_3': {'path': 'database/Toto_3.wav'}
},
'Valtteri': {
'Valtteri_1': {'path': 'database/Valtteri_1.wav'},
'Valtteri_2': {'path': 'database/Valtteri_2.wav'},
'Valtteri_3': {'path': 'database/Valtteri_3.wav'}
}
}
這是我一直在研究的代碼和我得到的結果
dict = {}
for x in os.listdir(directory):
dict[x[:-6]] = {}
for x in os.listdir(directory):
for key in dict:
if x[:-6] == key:
dict[key] = {x[:-4]: {'path': f'database/{x}'}}
這給了我這個。我認為這是因為由于 for 回圈而覆寫了鍵,但我似乎無法解決解決方案。
dict = {
'Max': {
'Max_3': {'path': 'database/Max_3.wav'}
},
'Toto': {
'Toto_3': {'path': 'database/Toto_3.wav'}
},
'Valtteri': {
'Valtteri_3': {'path': 'database/Valtteri_3.wav'}
}
}
幫助將不勝感激謝謝
uj5u.com熱心網友回復:
而不是在這里使用賦值運算子:
dict[key] = {x[:-4]: {'path': f'database/{x}'}}
呼叫update字典上的方法:
dict[key].update({x[:-4]:{'path': f'database/{x}'}})
uj5u.com熱心網友回復:
您可以使用collections 模塊中的defaultdict跳過更新,并跳過兩次列出您的目錄:
import pprint
from collections import defaultdict
# Standing in for your file tree
file_names = [
'Max_1.wav',
'Max_2.wav',
'Max_3.wav',
'Toto_1.wav',
'Toto_2.wav',
'Toto_3.wav',
'Valtteri_1.wav',
'Valtteri_2.wav',
'Valtteri_3.wav',
]
results = defaultdict(dict)
for fname in file_names:
top_key = fname[:-6]
file_key = fname[:-4]
results[top_key][file_key] = {'path': f'database/{fname}'}
pprint.pprint(dict(results))
{'Max': {'Max_1': {'path': 'database/Max_1.wav'},
'Max_2': {'path': 'database/Max_2.wav'},
'Max_3': {'path': 'database/Max_3.wav'}},
'Toto': {'Toto_1': {'path': 'database/Toto_1.wav'},
'Toto_2': {'path': 'database/Toto_2.wav'},
'Toto_3': {'path': 'database/Toto_3.wav'}},
'Valtteri': {'Valtteri_1': {'path': 'database/Valtteri_1.wav'},
'Valtteri_2': {'path': 'database/Valtteri_2.wav'},
'Valtteri_3': {'path': 'database/Valtteri_3.wav'}}}
uj5u.com熱心網友回復:
@tozCSS 的建議可以解決您的問題。我建議另一種方法,這在將來可能有用(并且不使用雙回圈):您也可以使用dict.setdefault方法:
out = {}
for x in os.listdir(directory):
out.setdefault(x.split('_')[0], {}).setdefault(x.split('.')[0], {}).update({'path': f'database/{x}'})
輸出:
{'Max': {'Max_1': {'path': 'database/Max_1.wav'},
'Max_2': {'path': 'database/Max_2.wav'},
'Max_3': {'path': 'database/Max_3.wav'}},
'Toto': {'Toto_1': {'path': 'database/Toto_1.wav'},
'Toto_2': {'path': 'database/Toto_2.wav'},
'Toto_3': {'path': 'database/Toto_3.wav'}},
'Valtteri': {'Valtteri_1': {'path': 'database/Valtteri_1.wav'},
'Valtteri_2': {'path': 'database/Valtteri_2.wav'},
'Valtteri_3': {'path': 'database/Valtteri_3.wav'}}}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/400136.html
