簡體   English   中英

加速將字典鍵和值與python列表中的字符串進行比較

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM