【问题标题】:Python for loop skips item [duplicate]Python for循环跳过项目[重复]
【发布时间】:2014-07-30 15:19:29
【问题描述】:

所以我有这个代码:

animals = ['cat', 'dog', 'waffle', 'giraffe', 'turtle']
breakfeast_foods = ['waffle', 'pancake', 'eggs']
for index, item in enumerate(animals):
    print item
    if item in breakfeast_foods:
        animals.pop(index)

由于某种原因,循环打印语句不打印“giraffe”。我不知道为什么,我缺少什么吗?

【问题讨论】:

  • 这是作业吗? if item not in... 有更好的方法
  • 可能是给别人的作业,但不是给我的。其他人实际上曾问我如何做到这一点(从列表中删除某些项目),这是我的回答。但是在我更仔细地检查了代码之后,我发现了这个奇怪的地方,所以我决定问为什么会这样。

标签: python python-2.7


【解决方案1】:

首先,它实际上是早餐而不是早餐。你打破(结束)的是斋戒(没有食物)而不是盛宴(有很多食物)。

但这只是我迂腐:-)


现在,进入实际问题。您不应该在枚举列表时修改它(从技术上讲,您可以这样做,但您会得到像您所看到的那样奇怪的结果)。

这样做会弄乱用于枚举的内部结构。这是一个简化的解释 (a) 但它应该说明这个概念:

将枚举想象成只是使用索引遍历animals 中的每个元素。

当您到达索引 2(华夫饼)并发现它在 breakfast_foods 中时,您删除该索引处的项目并将其他项目随机排列,以便您现在拥有:

['cat', 'dog', 'giraffe', 'turtle']

然后枚举移动到索引 3(现在是海龟)并打印出来,在此过程中跳过长颈鹿。

在任何情况下,也许一种更 Pythonic 的方式是:

animals = [x for x in animals if x not in breakfast_foods]

(a) Python 的特定实现是否使用简单数组或其他数据结构在这里并不重要。解释只是为了说明在迭代数据结构时更改数据结构通常会导致奇怪。

【讨论】:

  • -1。在 Python 解释中提出指针是没有帮助的。
  • @Steven,你看过 CPython 代码库吗? :-) 无论如何,我都会听从您的判断并使用不同的术语。
  • @Steven 还能怎么解释?
  • 我明白了,所以当我使用 .pop(index) 删除“waffle”时,它会将“giraffe”转移到“waffle”所在的位置,并且因为循环仍在运行,Python解释器认为它已经迭代了“长颈鹿”?
  • @Jeremy,是的,基本上就是这样。
猜你喜欢
  • 2015-05-17
  • 1970-01-01
  • 1970-01-01
  • 2011-10-11
  • 2013-02-01
  • 2021-08-23
  • 2014-07-20
  • 2017-02-12
相关资源
最近更新 更多