Sebagian besar waktu lebih mudah (dan lebih murah) untuk membuat iterasi pertama sebagai kasus khusus daripada yang terakhir:
first = True
for data in data_list:
if first:
first = False
else:
between_items()
item()
Ini akan bekerja untuk semua yang dapat diubah, bahkan bagi mereka yang tidak memiliki len()
:
file = open('/path/to/file')
for line in file:
process_line(line)
# No way of telling if this is the last line!
Terlepas dari itu, saya tidak berpikir ada solusi yang umumnya unggul karena tergantung pada apa yang Anda coba lakukan. Misalnya, jika Anda membuat string dari daftar, secara alami lebih baik menggunakan str.join()
daripada menggunakan for
loop "dengan case khusus".
Menggunakan prinsip yang sama tetapi lebih kompak:
for i, line in enumerate(data_list):
if i > 0:
between_items()
item()
Terlihat akrab, bukan? :)
Untuk @ofko, dan orang lain yang benar-benar perlu mencari tahu apakah nilai saat ini dari iterable without len()
adalah yang terakhir, Anda perlu melihat ke depan:
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
Maka Anda dapat menggunakannya seperti ini:
>>> for i, has_more in lookahead(range(3)):
... print(i, has_more)
0 True
1 True
2 False