Hầu hết các lần dễ dàng hơn (và rẻ hơn) để thực hiện lần lặp đầu tiên thành trường hợp đặc biệt thay vì lần cuối cùng:
first = True
for data in data_list:
if first:
first = False
else:
between_items()
item()
Điều này sẽ làm việc cho bất kỳ lặp đi lặp lại, ngay cả đối với những người không có len()
:
file = open('/path/to/file')
for line in file:
process_line(line)
# No way of telling if this is the last line!
Ngoài ra, tôi không nghĩ có một giải pháp chung vượt trội vì nó phụ thuộc vào những gì bạn đang cố gắng làm. Ví dụ: nếu bạn đang xây dựng một chuỗi từ một danh sách, thì sử str.join()
dụng một cách tự nhiên tốt hơn là sử dụng một for
vòng lặp với trường hợp đặc biệt.
Sử dụng cùng một nguyên tắc nhưng nhỏ gọn hơn:
for i, line in enumerate(data_list):
if i > 0:
between_items()
item()
Trông quen quá phải không? :)
Đối với @ofko và những người khác thực sự cần tìm hiểu xem giá trị hiện tại của một lần lặp mà không có giá trị len()
cuối cùng, bạn sẽ cần nhìn về phía trước:
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
Sau đó, bạn có thể sử dụng nó như thế này:
>>> for i, has_more in lookahead(range(3)):
... print(i, has_more)
0 True
1 True
2 False