当使用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')
谷歌让我想到了这个老问题,我想我可以用不同的方法来解决这个问题。
这里的大多数答案将处理一个正确的处理for循环控件,但如果data_list是可销毁的,我建议你从列表中弹出项目,直到你得到一个空列表:
while True:
element = element_list.pop(0)
do_this_for_all_elements()
if not element:
do_this_only_for_last_element()
break
do_this_for_all_elements_but_last()
如果不需要对最后一个元素做任何操作,甚至可以使用while len(element_list)。我发现这个解决方案比处理next()更优雅。
你的方法没有错,除非你有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
如果我这样做的话,对我来说很简单。