当使用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
我如何简化或改进它?
我想到的最简单的解决办法是:
for item in data_list:
try:
print(new)
except NameError: pass
new = item
print('The last item: ' + str(new))
所以我们总是通过延迟处理一个迭代来提前一个项目。为了在第一次迭代中跳过某些操作,我只需捕获错误。
当然,您需要考虑一下,以便在需要时引发NameError。
还要保留“counstruct”
try:
new
except NameError: pass
else:
# continue here if no error was raised
这依赖于之前没有定义名称new。如果你是偏执狂,你可以确保new不存在,使用:
try:
del new
except NameError:
pass
当然,你也可以使用if语句(if notfirst: print(new) else: notfirst = True)。但据我所知,开销更大。
Using `timeit` yields:
...: try: new = 'test'
...: except NameError: pass
...:
100000000 loops, best of 3: 16.2 ns per 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
如果我这样做的话,对我来说很简单。