La plupart du temps, il est plus facile (et moins coûteux) de faire de la première itération le cas particulier au lieu du dernier:
first = True
for data in data_list:
if first:
first = False
else:
between_items()
item()
Cela fonctionnera pour tout itérable, même pour ceux qui n'ont pas len()
:
file = open('/path/to/file')
for line in file:
process_line(line)
# No way of telling if this is the last line!
En dehors de cela, je ne pense pas qu'il existe une solution généralement supérieure car cela dépend de ce que vous essayez de faire. Par exemple, si vous construisez une chaîne à partir d'une liste, il est naturellement préférable d'utiliser str.join()
une for
boucle «avec cas particulier».
En utilisant le même principe mais plus compact:
for i, line in enumerate(data_list):
if i > 0:
between_items()
item()
Cela semble familier, n'est-ce pas? :)
Pour @ofko, et d'autres qui ont vraiment besoin de savoir si la valeur actuelle d'un itérable sans len()
est la dernière, vous devrez regarder vers l'avenir:
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
Ensuite, vous pouvez l'utiliser comme ceci:
>>> for i, has_more in lookahead(range(3)):
... print(i, has_more)
0 True
1 True
2 False