2017-02-02 5 views
0

Ich habe den folgenden Code, der Breite erste Suche (bfs) auf einer Liste von Grafikscheitelpunkten ausgeführt wird.Wie überspringen Sie die nächste Iteration während einer for-Schleife in Python?

Derzeit habe ich Code, der bfs für jedes Element in der Liste ausführt, aber ich möchte es so machen, dass, wenn das nächste Element in der for-Schleife bereits in der Gruppe der erkannten Knoten ist, die for-Schleife überspringen sollte darüber hinaus, so dass bfs nicht an jedem Eckpunkt ausgeführt werden muss.

Mein Hauptgrund dafür ist, weil ich eine sehr große Datei einlesen muss, so dass es einen Speicherabsturz verursacht, wenn ich bfs auf jedem Eckpunkt ausführe; Mein Code arbeitet mit kleinen Testfällen, aber nicht mit der großen Datei.

Ich weiß, die continue-Anweisung ermöglicht es Ihnen, über die aktuelle Iteration zu überspringen, aber ich kann nicht herausfinden, wie die nächste Iteration zu überspringen.

Jede Hilfe wird geschätzt; Danke.

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

Gibt es einen Grund, warum Sie die aktuelle Iteration nicht einfach überspringen können, wenn sich das aktuelle Element bereits in der Gruppe der erkannten Knoten befindet? –

+0

Können Sie angeben, wo (in welcher Schleife) dieses Überspringen stattfinden soll? Vielleicht fügen Sie einen bedingten und dann '# HELP - hier 'hinzu? –

Antwort

0

zwei Optionen, die Sie bis zu holen Sie ist:

1) Starten Sie Ihre Schleife mit einer Schutzklausel. Auf diese Weise können Sie continue aufrufen und diese Iteration der Schleife überspringen.

>>> 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) einen Generator in der for-Anweisung verwenden:

>>> 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 

Welche am besten ist, ist bis zu Ihnen.

+0

Sie sollten einen Satz für die "bekannten" Werte für O (1) Lookup anstelle von O (n) verwenden (was für große Dateien groß sein wird) – DaveBensonPhillips

+0

@DaveBensonPhillips guter Punkt! Bearbeitet. Möge auch immer guten Praktiken folgen :) – Baldrickk

+0

Danke, dass du mich auf den richtigen Weg gebracht hast! Ich habe das Gefühl, dass das Verwenden von Sets meinen Code viel aufräumen und beschleunigen wird. – guddu

Verwandte Themen