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()?请注意,item第二个 for 循环中的 s 是字符串,它们的内容在运行时是未知的,所以我不能寻找特定的字符串作为标志来让我在最后知道我。

谢谢!

4

3 回答 3

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之后进行测试的原因。

如果您必须拥有与您的 test 匹配的最后一项,请将其存储在一个新变量中:

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
于 2012-07-16T15:55:09.243 回答
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*

希望有帮助

于 2012-07-16T15:54:47.983 回答
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
于 2012-07-16T16:26:44.670 回答