for 循环在删除(或删除)同一列表的另一个元素后跳过一个列表元素[重复]

问题描述 投票:0回答:1

我正在 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 循环时,也会发生这种情况。 我错过了什么?

python for-loop iteration break
1个回答
0
投票

这里的这个问题(在 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', [])
© www.soinside.com 2019 - 2024. All rights reserved.