La mayoría de las veces es más fácil (y más barato) hacer que la primera iteración sea el caso especial en lugar del último:
first = True
for data in data_list:
if first:
first = False
else:
between_items()
item()
Esto funcionará para cualquier iterable, incluso para aquellos que no tienen len()
:
file = open('/path/to/file')
for line in file:
process_line(line)
# No way of telling if this is the last line!
Aparte de eso, no creo que haya una solución generalmente superior, ya que depende de lo que intente hacer. Por ejemplo, si está creando una cadena a partir de una lista, es naturalmente mejor usar str.join()
que usar un for
bucle "con mayúsculas y minúsculas".
Usando el mismo principio pero más compacto:
for i, line in enumerate(data_list):
if i > 0:
between_items()
item()
Parece familiar, ¿no? :)
Para @ofko, y otros que realmente necesitan averiguar si el valor actual de un iterable sin len()
es el último, deberá mirar hacia adelante:
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
Entonces puedes usarlo así:
>>> for i, has_more in lookahead(range(3)):
... print(i, has_more)
0 True
1 True
2 False