2011-07-26 176 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