2012-07-16 100 views
3

我有一個循環,是解析文本文件的行:執行一個操作的循環

for line in file: 
    if line.startswith('TK'): 
     for item in line.split(): 
      if item.startwith('ID='): 
       *stuff* 
      if last_iteration_of_loop 
       *stuff* 

我需要做幾個任務,但我不能這樣做,直到第二個for循環的最後一次迭代。有沒有辦法檢測到這種情況,或者是否知道在line.split()的最後一項是否即時通訊?作爲一個說明,第二個for循環中的item是字符串,我的內容在運行時是未知的,所以我不能查找特定的字符串作爲標誌讓我知道即時通訊結束。

謝謝!

回答

8

只是指最後一行外的for循環:

for line in file: 
    if line.startswith('TK'): 
     item = None 
     for item in line.split(): 
      if item.startwith('ID='): 
       # *stuff* 

     if item is not None: 
      # *stuff* 

item變量仍然是可用外的for循環:

>>> for i in range(5): 
...  print i 
... 
0 
1 
2 
3 
4 
>>> print 'last:', i 
last: 4 

請注意,如果您的文件爲空(不通過循環迭代)item將不會被設置;這就是爲什麼我們在循環之前設置了item = None並在之後測試了if item is not None

如果你必須有符合您的測試的最後一個項目,存儲在一個新的變量:

for line in file: 
    if line.startswith('TK'): 
     lastitem = None 
     for item in line.split(): 
      if item.startwith('ID='): 
       lastitem = item 
       # *stuff* 

     if lastitem is not None: 
      # *stuff* 

第二個選項示範:

>>> lasti = None 
>>> for i in range(5): 
...  if i % 2 == 0: 
...   lasti = i 
... 
>>> lasti 
4 
+4

'else'到一個'for'環是完全沒有意義的而無需在迴路中的'break'語句。 – 2012-07-16 15:56:19

+1

通常情況下,我會同意這種方法(同意@SvenMarnach)。但是如果OP在打印之前必須對'4'做些什麼呢?這在這個構造中效果不佳 – inspectorG4dget 2012-07-16 15:56:36

+0

我不認爲它記錄任何東西。即使習慣性地使用'for' /'else'也會令人困惑,但這實在令人困惑。 – 2012-07-16 15:59:41

1

試試這個:

for line in file: 
    if line.startswith('TK'): 
     items = line.split() 
     num_loops = len(items) 
     for i in range len(items): 
      item = items[i] 
      if item.startwith('ID='): 
       *stuff* 
      if i==num_loops-1: # if last_iteration_of_loop 
       *stuff* 

希望幫助

0

不知道爲什麼你能只是在最後一個循環之外修改,但是你可能可以利用這個 - 它可以與任何迭代器一起使用,而不僅僅是已知長度的那些...

不廣泛的測試和可能效率不高

from itertools import tee, izip_longest, count 

def something(iterable): 
    sentinel = object() 
    next_count = count(1) 

    iterable = iter(iterable) 
    try: 
     first = next(iterable) 
    except StopIteration: 
     yield sentinel, 'E', 0 # empty 

    yield first, 'F', next(next_count) # first 

    fst, snd = tee(iterable) 
    next(snd) 
    for one, two in izip_longest(fst, snd, fillvalue=sentinel): 
     yield one, 'L' if two is sentinel else 'B', next(next_count) # 'L' = last, 'B' = body 
相關問題