ほとんどの場合、最初のイテレーションを最後のイテレーションの代わりに特別なケースにする方が簡単(そして安価)です。
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、およびなしのイテラブルの現在の値が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