2011-07-26 135 views
8

回路是否有pythonic的方法(我,我可以使用范围循环知道(LEN(..)),并得到一个指数)做下面的例子:在蟒蛇

for line in list_of_strings: 
    if line[0] == '$': 
     while line[-1] == '#': 
      # read in the Next line and do stuff 
     # after quitting out of the while loop, the next iteration of the for loop 
     # should not get any of the lines that the while loop already dealt with 

本质,嵌套的同时,循环应该增加for循环。

编辑:没有一个文件句柄,混淆了两件事我工作的,它的串

列表
+3

使用line.startswith和line.endswith而不是line [0]和line [-1]。它适用于空行。而且看起来更好:)。 – utdemir

+0

@utdemir:心灵吹,我已经做了'LEN(线)这么多的检查> 0' – pseudosudo

回答

9

python中最基本的挑战之一是在迭代list s和dict s时变得聪明。如果你确实需要修改集合迭代时,你可能需要在一个复制或保存修改工作,在迭代结束申请。

在你的情况,不过,你只需要跳过列表中的项目。您可以通过将迭代扩展为更加明确的形式来管理。

i = iter(list_of_strings) 
for line in i: 
    if line.startswith('$'): 
     while line.endswith('#'): 
      line = i.next() 
     # do work on 'line' which begins with $ and doesn't end with # 

这就是你真正需要做的。

编辑:作为kindall提到,如果同时部分可重复过去的输入序列的末尾,你需要做的多一点。您可以执行以下操作。

i = iter(list_of_strings) 
for line in i: 
    if line[0] == '$': 
     try: 
      while line[-1] == '#': 
       line = i.next() 
     except StopIteration: 
      break 
     # do work on 'line' which begins with $ and doesn't end with # 
+0

如果'i.next()''提高StopIteration'(因为,比如说,在列表的最后一行以井号结束),它会不会被'抓for'。你需要单独看看。 – kindall

+0

@kindall:嗯。看起来你可能是对的。固定 – SingleNegationElimination

5

只要file是一个文件句柄,你可以做,而不是使用readlines方法本():

for line in fh: 
    if line[0] == '$': 
    while line[-1] == '#': 
     line = next(fh) 

文件句柄是可迭代的,并且next()函数从可迭代文件中检索下一个值。

+0

不好意思啊,混淆了两个不同的问题,它不是一个文件句柄 – pseudosudo

+1

我觉得g.d.d.c还是回答你的问题。使用next()来调整你的迭代 –

+1

缺少的环节是,如果'list_of_strings'是迭代,然后'FH = ITER(为List_Of_Strings)'之前的for循环需要。它发生'文件'是他们自己的迭代器,虽然'列表'不是。 – SingleNegationElimination