【问题标题】:How to skip the next iteration during a for loop in python?如何在python中的for循环期间跳过下一次迭代?
【发布时间】:2017-02-02 16:46:09
【问题描述】:

我有以下代码在图形顶点列表上运行广度优先搜索 (bfs)。

目前我有代码在列表中的每个项目上运行 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

【问题讨论】:

  • 如果当前项目已经在发现的节点集中,是否有理由不能简单地跳过当前迭代?
  • 你能指出你希望这个跳过发生在哪里(哪个循环)?也许添加一个条件然后# HELP - here

标签: python


【解决方案1】:

两个选项,由你选择:

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) 在 for 语句中使用生成器:

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

哪个是最好的取决于你。

【讨论】:

  • 您应该使用一组 known 值进行 O(1) 查找,而不是 O(n)(对于大文件来说会很大)
  • @DaveBensonPhillips 好点!已编辑。不妨始终遵循良好的做法:)
  • 感谢您让我走上正轨!我有一种感觉,使用集合会更加清理和加速我的代码。
猜你喜欢
  • 2023-03-15
  • 2013-07-24
  • 2021-08-23
  • 1970-01-01
  • 2022-01-07
  • 2016-10-15
  • 2020-05-21
  • 2015-11-11
  • 1970-01-01
相关资源
最近更新 更多