ほとんどの場合、最後の反復ではなく最初の反復を特殊なケースにする方が簡単 (かつ安価)です。
first = True
for data in data_list:
if first:
first = False
else:
between_items()
item()
これは、ないものであっても、あらゆるイテラブルに対して機能しますlen()
。
file = open('/path/to/file')
for line in file:
process_line(line)
# No way of telling if this is the last line!
それとは別に、何をしようとしているのかにもよるので、一般的に優れた解決策はないと思います。たとえば、リストから文字列を作成している場合、 「特殊なケースで」ループを使用するstr.join()
よりも、使用する方が当然優れています。for
同じ原理を使用して、よりコンパクトにします。
for i, line in enumerate(data_list):
if i > 0:
between_items()
item()
おなじみですね。:)
@ofko や iterable の現在の値がlen()
最後の値かどうかを本当に確認する必要がある人は、先を見据える必要があります。
def lookahead(iterable):
"""Pass through all values from the given iterable, augmented by the
information if there are more values to come after the current one
(True), or if it is the last value (False).
"""
# Get an iterator and pull the first value.
it = iter(iterable)
last = next(it)
# Run the iterator to exhaustion (starting from the second value).
for val in it:
# Report the *previous* value (more to come).
yield last, True
last = val
# Report the last value.
yield last, False
次に、次のように使用できます。
>>> for i, has_more in lookahead(range(3)):
... print(i, has_more)
0 True
1 True
2 False