2017-02-02 639 views
0

我有以下代碼在圖頂點列表上運行寬度優先搜索(bfs)。如何在python for循環中跳過下一個迭代?

目前我有在列表中的每個項目上運行bfs的代碼,但是我想這樣做以便如果for循環中的下一個項目已經在發現的節點集合中,那麼for循環應該跳過在它上面,這樣bfs不必在每個頂點執行。

我這樣做的主要原因是因爲我必須讀取非常大的文件,所以當我在每個頂點上執行bfs時會導致內存崩潰;我的代碼適用於小型測試用例,但不適用於大型文件。

我知道continue語句可以跳過當前的迭代,但我不知道如何跳過下一次迭代。

任何幫助表示讚賞;謝謝。

def count_components(g): 
    dictionary = {} 
    dict_list = {} 
    for i in g.vertices(): 
     dictionary = breadth_first_search(g,i) 
     dictionary_keys = list(dictionary.keys()) 
     dict_list[i] = dictionary_keys 
    for value in dict_list.values(): 
     for i in range(len(value)): 
     value[i] = str(value[i]) 
    result = {} 
    for key, value in dict_list.items(): 
     dict_list[key].sort(key=str.lower) 
     if value not in result.values(): 
     result[key] = value 
    count = len(result) 
    return count 
+0

如果當前項目已存在於已發現節點集合中,是否存在不能簡單地跳過當前迭代的原因? –

+0

你能指出你想要跳過哪裏(哪個循環)嗎?也許添加一個條件,然後'#幫助 - 這裏'? –

回答

0

兩個選項,你選擇是由你:

1)保護條款啓動循環。這使您可以撥打continue並跳過該循環的迭代。

>>> values = [0,1,2,1,0] 
>>> known = set([2]) 
>>> for i in values: 
... if i in known: 
...  continue 
... print i 
... known.add(i) 
... 
0 
1 

2)在使用發電機聲明:

>>> values = [0,1,2,1,0] 
>>> known = set([2]) 
>>> for i in (x for x in values if not x in known): 
... print i 
... known.add(i) 
... 
0 
1 

哪一個是最好的給你。

+0

你應該使用O(1)查找的'已知'值而不是O(n)(對於大文件來說這將會很大) – DaveBensonPhillips

+0

@DaveBensonPhillips好點!編輯。也可以隨時遵循良好的做法:) – Baldrickk

+0

謝謝你讓我開始正確的軌道!我有一種感覺,使用套件將清理並加速我的代碼更多。 – guddu