当使用for循环迭代时,我如何处理输入的最后一个元素?特别是,如果有代码应该只出现在元素之间(而不是在最后一个元素之后),我该如何构造代码?
目前,我写的代码是这样的:
for i, data in enumerate(data_list):
code_that_is_done_for_every_element
if i != len(data_list) - 1:
code_that_is_done_between_elements
我如何简化或改进它?
我在下面分享了两个简单的方法来查找循环的结束。
方法1:
num_list = [1, 2, 3, 4]
for n in num_list:
if num_list[-1] == n:
print('this is the last iteration of the loop')
方法2:
num_list = [1, 2, 3, 4]
loop_count = len(num_list) - 1 # 3
for index, num in enumerate(num_list):
if index == loop_count:
print('this is the last iteration of the loop')
你的方法没有错,除非你有10万个循环,想要保存10万个“if”语句。在这种情况下,你可以这样做:
iterable = [1,2,3] # Your date
iterator = iter(iterable) # get the data iterator
try : # wrap all in a try / except
while 1 :
item = iterator.next()
print item # put the "for loop" code here
except StopIteration, e : # make the process on the last element here
print item
输出:
1
2
3
3
但说真的,在你的情况下,我觉得这太过分了。
在任何情况下,你可能会更幸运的切片:
for item in iterable[:-1] :
print item
print "last :", iterable[-1]
#outputs
1
2
last : 3
或者只是:
for item in iterable :
print item
print iterable[-1]
#outputs
1
2
3
last : 3
最终,一个KISS的方式来做你的事情,这将适用于任何迭代对象,包括那些没有__len__的迭代对象:
item = ''
for item in iterable :
print item
print item
Ouputs:
1
2
3
3
如果我这样做的话,对我来说很简单。
我将提供一种更优雅和健壮的方式,如下所示,使用unpacking:
def mark_last(iterable):
try:
*init, last = iterable
except ValueError: # if iterable is empty
return
for e in init:
yield e, True
yield last, False
测试:
for a, b in mark_last([1, 2, 3]):
print(a, b)
结果是:
1真正的
2真
3错误