在for循环中再次迭代

时间:2011-01-26 21:19:15

标签: python for-loop

有没有办法在for循环中再次迭代 ?例如:

for x in list:
  if(condition):
      #I'd like to grab the next iteration of the list 

所以,如果我有[1,2,3,4],我首先迭代1,然后尝试在for循环中将迭代推进到2,这样当循环再次启动时,它将是在3点。

可能的?

我正在创建一个读取if语句的解析器,然后想要读取行,直到它到达终止if语句的行。

7 个答案:

答案 0 :(得分:3)

你可以这样做:

a = [1,2,3,4,5]
b = iter(a)

try:
    while True:
        c = b.next()
        if (condition):
            c = b.next()
except StopIteration:
    pass

答案 1 :(得分:3)

如果您正在使用的项目是可迭代对象,则可以使用item.next()来获取下一个元素。但是,如果需要,您需要确保获取StopIteration例外。

>>> it = iter(range(5))
>>> for x in it:
...     print x
...     if x > 3:
...         print it.next()
... 
0 1 2 3 4
Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
StopIteration

答案 2 :(得分:1)

您需要continue声明。

for x in list:
  if(condition):
      continue

答案 3 :(得分:1)

skip = False
for x in list:
    if skip:
        skip = False
        continue
    # Do your main loop logic here
    if (condition):
        skip = True

答案 4 :(得分:1)

您可以使用while循环代替for。在伪代码中:

idx = 0
while idx < length(list)
    x = list[idx]
    ...
    if (condition)
        idx += 1
    ...
    idx += 1

答案 5 :(得分:1)

您始终可以绕过for循环并显式使用迭代器:

iter = list.__iter__()
while True:
    x = iter.next()
    ...
    if (condition):
        x = iter.next()
    ...

这将在到达列表末尾时抛出StopIteration异常。

答案 6 :(得分:0)

我怀疑你解析if语句的方法不是一个很好的方法。您还会发现,您不能嵌套您的IF语句,也不能将它们全部放在一行。这是我如何去做。

a)将您的语言转换为BNF表格。例如,对于if语句,它可能是

ifstmnt ::=  IF &lt;condiftion> THEN &lt;trueblock> [ ELSE &lt;elseblock> ]

statment ::= ifstmnt | assignstment | whilestmnt | forstmnt 

b)在每个点找出你在等待的东西。在IF之后,你会读到一个条件,直到你看到那个。

c)编写一个getNextToken例程,该例程读取源中的字符,直到它具有完整的令牌。令牌是可识别的单位 - IF,THEN,数字,符号。每次调用它都会将令牌返回到缓冲区。有一个类型和值返回也很有用 - 它可以节省你在许多地方转换数字。表驱动方法非常快速和灵活。

d)然后编写许多小例程来识别每种类型的语句。一个用于IF,一个用于条件,一个用于块,一个用于语句,一个用于表达等。这些将相互调用并在它们识别语句时返回。例如,条件表达式识别器将读取一个布尔表达式并吃掉所有名称,AND,OR等,直到它向前看并看到那个。它无法处理,因此它存在,并且IF重新识别器发现令牌是那么,它读取下一个并且调用识别器以获得块(可能期望BEGIN,许多语句然后是END)。

e)每个例程都会收集所需的数据 - condition,trueblock,falseblock,并根据需要对其进行处理。一种非常常见的处理方法是在内存中创建程序的树表示。程序员定义的名称在定义时收集在字典中,并在使用时进行检查。

f)真正的编译器会尝试重新排列树以使事情变得更有效 - 但我建议这是未来的发展

然后,最后的行动是走树,以某种方式评估它。如果你正在编写一个解释器,你可以计算值并存储,然后存储 - 将值存储在doctionary中。如果您正在编写真正的编译器,则需要为链接器生成合适的输出。这是一项重大任务。

查看YACC和LEX。它们是专门用于完成部分工作的工具,可以节省您的时间。帮助你的研究的术语是“词法分析”“解析器”和类似的。

祝你好运。你的项目非常重要!

另见http://nedbatchelder.com/text/python-parsers.html