我正在 Codecademy 上处理循环挑战。 当前的任务是编写一个以数字列表作为参数的函数,并从前面删除元素,直到列表的前面不均匀为止。
我尝试使用 for 循环,检查偶数,如果是,则将其从列表中删除。但由于某种原因,在删除第一个偶数后,循环似乎跳过了第二个偶数。当我注释掉删除语句时,这种情况不会发生,但我不明白为什么。
下面您将找到两个版本的代码和结果。一个带有注释掉的删除语句,另一个带有删除语句,这是有问题的结果。
带有注释的删除语句的第一个版本:
def delete_starting_evens(my_list):
# iterate through numbers in list with for loop
for num in my_list:
# check if num is even
if num % 2 == 0:
# print statement for control
print("if case:", num)
# outcommented remove and delete statements causing trouble
# my_list.remove(num)
# del my_list[0]
# print statement for control
print("resulting list:", my_list)
# else, if num not even
else:
# print statment for control
print("else case", num)
break
# return with string for controlling, returns a tuple
return "return statement", my_list
print(delete_starting_evens([4, 8, 10, 11, 12, 15]))
print(delete_starting_evens([4, 8, 10]))
代码输出
if case: 4
resulting list: [4, 8, 10, 11, 12, 15]
if case: 8
resulting list: [4, 8, 10, 11, 12, 15]
if case: 10
resulting list: [4, 8, 10, 11, 12, 15]
else case 11
('return statement', [4, 8, 10, 11, 12, 15])
if case: 4
resulting list: [4, 8, 10]
if case: 8
resulting list: [4, 8, 10]
if case: 10
resulting list: [4, 8, 10]
('return statement', [4, 8, 10])
正如我们在上面看到的,循环开始迭代偶数,按预期打印三件事:确认 if 语句的 if 字符串、选定的数字 (num) 和更新的列表。 一旦满足“else case”,循环就会打印 else-string 并按预期中断,然后函数返回带有列表的最终版本的返回字符串。 到目前为止一切顺利。
现在我取消注释删除语句:
def delete_starting_evens(my_list):
# iterate through numbers in list with for loop
for num in my_list:
# check if num is even
if num % 2 == 0:
# print statement for control
print("if case:", num)
# now the remove statement is included
my_list.remove(num)
# outcommented delete statements causing trouble
# del my_list[0]
# print statement for control
print("resulting list:", my_list)
# else, if num not even
else:
# print statment for control
print("else case", num)
break
# return with string for controlling, returns a tuple
return "return statement", my_list
print(delete_starting_evens([4, 8, 10, 11, 12, 15]))
print(delete_starting_evens([4, 8, 10]))
考虑到删除语句,我希望打印开头的所有偶数并从列表中删除,直到 for 循环到达第一个奇数并中断。
但是输出如下:
# Code output
if case: 4
resulting list: [8, 10, 11, 12, 15]
if case: 10
resulting list: [8, 11, 12, 15]
if case: 12
resulting list: [8, 11, 15]
('return statement', [8, 11, 15])
if case: 4
resulting list: [8, 10]
if case: 10
resulting list: [8]
('return statement', [8])
它跳过了偶数8?当我使用 del 语句而不是 remove 语句运行 for 循环时,也会发生这种情况。 我错过了什么?
这里的这个问题(在 for 循环中删除数组的元素 - for 循环跳过下一个条目的问题)帮助我理解了这个问题。
问题: for 循环遍历列表的每个索引,一旦删除列表开头的元素,第二个元素将成为第一个,第三个元素将成为第二个,依此类推。这解释了跳过。
解决方案: 我的解决方法是复制该列表。因此需要迭代列表和要操作列表的 cpy。
现在可以使用了,代码如下:
def delete_starting_evens(my_list):
# make copy to manipulate, without disturbing iteration of for-loop
my_list_2 = my_list.copy()
# iterate through numbers in list with for loop
for num in my_list:
# check if num is even
if num % 2 == 0:
# print statement for control
print("if case:", num)
# uncommented remove and delete statements causing trouble
my_list_2.remove(num)
# del my_list[0]
print("resulting list:", my_list_2)
# else, if num not even
else:
# print statment for control
print("else case", num)
break
# return with string for controlling, returns a tuple
return "return statement", my_list_2
print(delete_starting_evens([4, 8, 10, 11, 12, 15]))
print(delete_starting_evens([4, 8, 10]))
结果是预料之中的
Output:
if case: 4
resulting list: [8, 10, 11, 12, 15]
if case: 8
resulting list: [10, 11, 12, 15]
if case: 10
resulting list: [11, 12, 15]
else case 11
('return statement', [11, 12, 15])
if case: 4
resulting list: [8, 10]
if case: 8
resulting list: [10]
if case: 10
resulting list: []
('return statement', [])