抱歉,如果這是微不足道的,我仍在學習,但我有一個字典串列,如下所示:
[{'1102': ['00576', '00577', '00578', '00579', '00580', '00581']},
{'1102': ['00582', '00583', '00584', '00585', '00586', '00587']},
{'1102': ['00588', '00589', '00590', '00591', '00592', '00593']},
{'1102': ['00594', '00595', '00596', '00597', '00598', '00599']},
{'1102': ['00600', '00601', '00602', '00603', '00604', '00605']}
...]
它包含約 89000 個字典。我有一個包含 4473208 條路徑的串列。例子:
['/****/**/******_1102/00575***...**0CT.csv',
'/****/**/******_1102/00575***...**1CT.csv',
'/****/**/******_1102/00575***...**2CT.csv',
'/****/**/******_1102/00575***...**3CT.csv',
'/****/**/******_1102/00575***...**4CT.csv',
'/****/**/******_1102/00578***...**1CT.csv',
'/****/**/******_1102/00578***...**2CT.csv',
'/****/**/******_1102/00578***...**3CT.csv',
...]
我想要做的是將包含鍵的檔案夾中dict中包含分組值的每個路徑組合在一起。
我嘗試使用這樣的 for 回圈:
grpd_cts = []
for elem in tqdm(dict_list):
temp1 = []
for file in ct_paths:
for key, val in elem.items():
if (file[16:20] == key) and (any(x in file[21:26] for x in val)):
temp1.append(file)
grpd_cts.append(temp1)
但這需要大約 30 小時。有沒有辦法讓它更有效率?任何 itertools 功能或什么?
非常感謝!
uj5u.com熱心網友回復:
ct_paths在您的內部回圈中反復迭代,您只對它的一點點感興趣以用于測驗目的;把它拿出來,用它來索引你的其余資料,作為一個字典。
使您的問題變得復雜的是您希望以原始檔案名串列結束,因此您需要構建一個兩級字典,其中值是分組在這兩個鍵下的所有原件的串列。
ct_path_index = {}
for f in ct_paths:
ct_path_index.setdefault(f[16:20], {}).setdefault(f[21:26], []).append(f)
grpd_cts = []
for elem in tqdm(dict_list):
temp1 = []
for key, val in elem.items():
d2 = ct_path_index.get(key)
if d2:
for v in val:
v2 = d2.get(v)
if v2:
temp1 = v2
grpd_cts.append(temp1)
ct_path_index看起來像這樣,使用您的資料:
{'1102': {'00575': ['/****/**/******_1102/00575***...**0CT.csv',
'/****/**/******_1102/00575***...**1CT.csv',
'/****/**/******_1102/00575***...**2CT.csv',
'/****/**/******_1102/00575***...**3CT.csv',
'/****/**/******_1102/00575***...**4CT.csv'],
'00578': ['/****/**/******_1102/00578***...**1CT.csv',
'/****/**/******_1102/00578***...**2CT.csv',
'/****/**/******_1102/00578***...**3CT.csv']}}
(setdefault第一次看到時可能有點難以理解)在構建集合的集合時很重要,并且在這些情況下很常見:它確保子集合是按需創建的然后重新用于給定的密鑰。
現在,您只有兩個嵌套回圈;內部檢查是使用接近 O(1) 的字典查找來完成的。
其他優化包括將串列dict_list轉換為集合,如果您多次通過,這將是值得的dict_list。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/481514.html
