In den meisten Fällen ist es einfacher (und billiger), die erste Iteration anstelle der letzten zum Sonderfall zu machen :
first = True
for data in data_list:
if first:
first = False
else:
between_items()
item()
Dies funktioniert für alle iterierbaren Elemente, auch für diejenigen, die keine haben len()
:
file = open('/path/to/file')
for line in file:
process_line(line)
# No way of telling if this is the last line!
Abgesehen davon glaube ich nicht, dass es eine allgemein überlegene Lösung gibt, da dies davon abhängt, was Sie versuchen zu tun. Wenn Sie beispielsweise eine Zeichenfolge aus einer Liste erstellen, ist es natürlich besser, diese zu verwenden, str.join()
als eine for
Schleife „mit Sonderfall“ zu verwenden.
Nach dem gleichen Prinzip, aber kompakter:
for i, line in enumerate(data_list):
if i > 0:
between_items()
item()
Kommt mir bekannt vor, nicht wahr? :) :)
Für @ofko und andere, die wirklich herausfinden müssen, ob der aktuelle Wert eines iterierbaren ohne len()
der letzte ist, müssen Sie nach vorne schauen:
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
Dann können Sie es so verwenden:
>>> for i, has_more in lookahead(range(3)):
... print(i, has_more)
0 True
1 True
2 False