在python中for循环的最后一次迭代期间执行操作

在python中for循环的最后一次迭代期间执行操作,python,for-loop,Python,For Loop,我有一个循环正在解析文本文件的行: 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循环的最后一次

我有一个循环正在解析文本文件的行:

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循环的最后一次迭代,我才能完成。有没有办法检测到这一点,或者有没有办法知道im是否位于
line.split()
的最后一项?需要注意的是,第二个for循环中的
s是字符串,它们的内容在运行时是未知的,因此我无法查找特定的字符串作为标志,以便在最后通知我im

谢谢

试试这个:

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*

希望这会有所帮助

只需参考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 i in range(5):
...     print i
... 
0
1
2
3
4
>>>  print 'last:', i
last: 4
变量在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 i in range(5):
...     print i
... 
0
1
2
3
4
>>>  print 'last:', i
last: 4
请注意,如果文件为空(循环中没有迭代)
将不会被设置;这就是为什么我们在循环之前设置
item=None
,之后如果item不是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

不知道为什么不能在最后一个循环之外进行修改,但您可以利用它-它可以与任何迭代器一起工作,而不仅仅是那些已知长度的迭代器

未经过广泛测试,可能效率不高

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

else
for
循环是完全没有意义的,如果循环中没有
break
语句。通常,我同意这种方法(同意@SvenMarnach)。但是如果OP在打印出来之前必须对
4
做些什么呢?在这种情况下,这将不会很好地工作。我不认为它记录了任何东西。即使是惯用的
for
/
else
也会让人困惑,但这真的很让人困惑。啊,是的,我忘记了
break
跳过任何
else
子句……所以我不得不同意你最初的评论。@Martijn Pieters:那更好。