当使用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 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
所以我认为开销是不可能当选的。
我在下面分享了两个简单的方法来查找循环的结束。
方法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')
“code between”是头尾模式的一个例子。
你有一个项目,后面是一系列(项目之间)对。您还可以将其视为(item, between)对的序列,后跟一个item。通常更简单的做法是将第一个元素作为特殊元素,而将所有其他元素作为“标准”情况。
此外,为了避免重复代码,必须提供一个函数或其他对象来包含不想重复的代码。在循环中嵌入if语句,除非有一次总是假的,这有点傻。
def item_processing( item ):
# *the common processing*
head_tail_iter = iter( someSequence )
head = next(head_tail_iter)
item_processing( head )
for item in head_tail_iter:
# *the between processing*
item_processing( item )
这更可靠,因为它更容易证明,它不会创建额外的数据结构(即列表的副本),也不需要大量浪费if条件的执行,if条件总是假的,只有一次例外。