2017-02-02 3 views
0

У меня есть следующий код, который выполняет поиск ширины первого порядка (bfs) в списке вершин графа.Как пропустить следующую итерацию во время цикла for в python?

В настоящее время у меня есть код, который работает на 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 - здесь?? –

ответ

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

Смежные вопросы