【问题标题】:for loop to eliminate even numbersfor循环消除偶数
【发布时间】:2021-10-08 03:31:23
【问题描述】:

他们要我浏览一个列表并删除所有偶数实例。我应该一直删除偶数,直到达到一个奇数。

当我使用参数 4,8 和 10 调用我的函数时,我的函数将返回 10。我不知道为什么,我的 if 语句不应该解决这个问题吗?

def delete_starting_evens(lst):
 for number in lst:
  if number%2==0 and len(lst)>0:
   lst.pop(0)
 else:
   break
return lst


print(delete_starting_evens([4, 8, 10, 11, 12, 15]))
print(delete_starting_evens([4, 8, 10]))

【问题讨论】:

  • 请注意,.pop 方法具有 O(n²) 性能,但它可以在 O(n) 内完成,每次找到要删除的内容时使用重复的切片分配(但更常见的是,人们通过简单地复制而不是就地执行来实现 O(n)。如果您想表现得像就地一样,则可以对原始对象执行完整的切片分配)

标签: python-3.x for-loop


【解决方案1】:

你的功能不起作用的原因是因为你一直在做:

lst.pop(0)

这行代码总是弹出第一个元素,不管它是偶数还是奇数。

您可以使用带有计数器的 for 循环来代替使用 for each 循环,以说明列表的长度会随着每次删除而改变:

def delete_starting_evens(lst):
  index = 0
  for counter in range(len(lst)):
   if lst[index] % 2 == 0:
    lst.pop(index)
    index -= 1
   else:
     break
   index += 1
  return lst


print(delete_starting_evens([4, 8, 10, 11, 12, 15]))
print(delete_starting_evens([4, 8, 10]))

现在让我解释一下索引的递增和递减。在for循环的每次迭代之后,我们要检查数组中的下一个元素是否为偶数,所以我们这样做:

index += 1

然而,一旦我们遇到一个偶数元素并弹出它,它之后的所有元素的索引都会减少1。这意味着如果我们继续索引,我们将跳过一个元素,所以我们需要通过减少来解决这个问题每次弹出元素时我们的计数器索引。

【讨论】:

  • 感谢您的回答,我需要遍历列表直到遇到奇数。第一个列表应该返回 11、12、15。如果我理解你的代码,你检查索引 0 看它是否是偶数。如果是你弹出它然后你从列表末尾检查列表?
  • 现在应该修复
  • @GustavBodin 我的代码能回答你的问题吗?
  • 是的,我需要,我只需要皱起我的额头并理解带有 =+ 和 =- 索引的代码。非常感谢古斯塔夫
  • @GustavBodin 我编辑了我的帖子以澄清更多信息。一旦你对解释感到满意,你可以接受我的回答或者问我是否需要更多解释:)
【解决方案2】:

在 for-each-loop 中,您不必测试列表的长度。您对列表中的每个数字重复它。这样你的长度就永远大于0。

【讨论】:

  • 很多,除非你按照 Aniketh 用索引写的那样删除索引 =-
猜你喜欢
  • 2014-01-29
  • 1970-01-01
  • 2015-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-04
  • 1970-01-01
相关资源
最近更新 更多