我有一个解析文本文件行的循环:
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
是字符串,我在运行时它们的内容是未知的,所以我不能找到一个特定的字符串作为标志,让我知道最后的结果。< / p>
谢谢!
答案 0 :(得分: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*
{for}循环之外仍然可以使用item
变量:
>>> 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
答案 1 :(得分: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*
希望有所帮助
答案 2 :(得分: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