Na maioria das vezes, é mais fácil (e mais barato) tornar a primeira iteração o caso especial, em vez da última:
first = True
for data in data_list:
if first:
first = False
else:
between_items()
item()
Isso funcionará para qualquer iterável, mesmo para aqueles que não possuem len()
:
file = open('/path/to/file')
for line in file:
process_line(line)
# No way of telling if this is the last line!
Além disso, não acho que exista uma solução geralmente superior, pois depende do que você está tentando fazer. Por exemplo, se você estiver construindo uma string a partir de uma lista, é naturalmente melhor usar do str.join()
que usar um for
loop "com caso especial".
Usando o mesmo princípio, mas mais compacto:
for i, line in enumerate(data_list):
if i > 0:
between_items()
item()
Parece familiar, não é? :)
Para o @ofko e outros que realmente precisam descobrir se o valor atual de um iterável sem len()
é o último, você precisará olhar para o futuro:
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
Então você pode usá-lo assim:
>>> for i, has_more in lookahead(range(3)):
... print(i, has_more)
0 True
1 True
2 False