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*

いくつかの割り当てを行う必要がありますが、2 番目の for ループの最後の反復まで行うことができません。これを検出する方法、またはの最後の項目にいるかどうかを知る方法はありline.split()ますか? 注意として、item2 番目の for ループの s は文字列であり、それらの内容は実行時に不明であるため、フラグとして特定の文字列を検索して、最後に im を知らせることはできません。

ありがとう!

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*

変数は、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

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*

2 番目のオプションのデモンストレーション:

>>> 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 に答える