2017-02-02 6 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

このスキップをどこで(どのループで)実行するかを指定できますか?条件付きで '#HELP - here'を追加してください。 –

答えて

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(n)の代わりにO(1)ルックアップのための 'known'値のセットを使用するべきです(大きなファイルの場合は大) – DaveBensonPhillips

+0

@DaveBensonPhillips良い点!編集されました。いつも良い練習に従うこともあります:) – Baldrickk

+0

私は正しい軌道に乗り始めてくれてありがとう!私は、セットを使用するとクリーンアップし、自分のコードをはるかに高速化する気がします。 – guddu

関連する問題