[英]accelerate comparing dictionary keys and values to strings in list in python
抱歉,如果這是微不足道的,我仍在學習,但我有一個字典列表,如下所示:
[{'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 功能或什么?
非常感謝!
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
,這將是值得的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.