La plupart du temps, il est plus facile (et moins cher) de faire la première itération, le cas spécial au lieu de la dernière:
first = True
for data in data_list:
if first:
first = False
else:
between_items()
item()
Cela fonctionne pour n'importe quel itérable, même pour ceux qui n'ont pas d' 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, il est généralement supérieur à la solution, car il dépend de ce que vous essayez de faire. Par exemple, si vous êtes à la construction d'une chaîne à partir d'une liste, il est naturellement préférable d'utiliser str.join()
que l'utilisation d'un for
boucle "avec cas spécial".
En utilisant le même principe, mais plus compact:
for i, line in enumerate(data_list):
if i > 0:
between_items()
item()
Semble familier, n'est-ce pas? :)
Pour @ofko, et d'autres qui en ont vraiment besoin pour savoir si la valeur actuelle d'un objet iterable sans len()
est le dernier, vous aurez besoin de regarder à l'avance:
def lookahead(iterable):
it = iter(iterable)
last = it.next() # next(it) in Python 3
for val in it:
yield last, False
last = val
yield last, True
Ensuite, vous pouvez l'utiliser comme ceci:
>>> for i, last in lookahead(range(3)):
... print i, last
0 False
1 False
2 True