for循环中的迭代器:为什么这不起作用?

时间:2014-02-28 12:40:20

标签: python loops for-loop iterator

我有这段代码,它没有用,我不知道为什么。

我的数据结构:

  • “基因”是一个字典,其关键是ID,值为倍数 对象Gene。
  • 的实例
  • Gene对象包含一个带有实例的类似字典 对象“Transcript”。

最后,“parent”是Transcript(字符串)的ID。 我需要获取与字符串“parent”具有相同ID的Transcript实例(ptrans)。 它位于一个Gene实例中。

当我在底部运行代码时,我没有得到一个真正的异常,而是一个“StopIteration”,我以为我会抓住它,之后它应该继续使用下一个Gene对象,对吧?:

Traceback (most recent call last): File "<stdin>", line 1, in <module> ... ptrans = next(t for t in g.transcripts.values() if t.ID == parent) StopIteration

我可以使用嵌套的for循环来完成它,但我可能也会这样做。我无法理解这不起作用的事实。谁能解释为什么,或者它如何起作用?

    # iterate over Gene-dict
    for g in genes.values(): 
        #Iterate over Transcripts in 1 Gene
        try:
            ptrans = next(t for t in g.transcripts.values() if t.ID == parent)
        #If no match, continue
        except StopIteration:
            continue
        if ptrans:
                break

1 个答案:

答案 0 :(得分:2)

您的代码

ptrans = next(t for t in g.transcripts.values() if t.ID == parent)

几乎可以肯定没有按照你的想法行事。我怀疑g.transcript.values()中没有项目将父项作为其ID,因为在空发生器上调用next()确实会引发StopIteration错误。

然而,next()函数在任何情况下都只会调用一次,这意味着即使有效值,也只会返回第一个。嵌套循环是一种更简单的方法来实现您的目标。