La maggior parte delle volte è più semplice (ed economico) rendere la prima iterazione il caso speciale anziché l'ultimo:
first = True
for data in data_list:
if first:
first = False
else:
between_items()
item()
Questo funzionerà per qualsiasi iterabile, anche per quelli che non hanno len()
:
file = open('/path/to/file')
for line in file:
process_line(line)
# No way of telling if this is the last line!
A parte questo, non penso che ci sia una soluzione generalmente superiore in quanto dipende da cosa stai cercando di fare. Ad esempio, se stai costruendo una stringa da un elenco, è naturalmente meglio usarlo str.join()
che usare un for
ciclo "con un caso speciale".
Utilizzando lo stesso principio ma più compatto:
for i, line in enumerate(data_list):
if i > 0:
between_items()
item()
Sembra familiare, vero? :)
Per @ofko e altri che hanno davvero bisogno di scoprire se il valore attuale di un iterabile senza len()
è l'ultimo, dovrai guardare avanti:
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
Quindi puoi usarlo in questo modo:
>>> for i, has_more in lookahead(range(3)):
... print(i, has_more)
0 True
1 True
2 False