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

相关问题