当使用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
所以我认为开销是不可能当选的。
谷歌让我想到了这个老问题,我想我可以用不同的方法来解决这个问题。
这里的大多数答案将处理一个正确的处理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()更优雅。