Pandas中for循环运行结果不符预期问题咨询
问题描述
我对两段代码片段的运行结果感到十分困惑,原本预期两段代码会输出完全相同的结果,但实际运行情况并非如此,运行结果截图显示两段代码输出内容存在差异。
差异原因
- 若其中一段代码是在for循环中直接遍历原列表并做增删操作:这类写法的迭代逻辑是按索引顺序逐位取值,当你删除/插入元素时,列表后续所有元素的索引都会整体前移/后移一位,下一轮循环会直接跳过偏移后对应位置的元素,最终得到的结果不符合预期。
- 若另一段代码是列表推导式/生成新列表的筛选写法:这类写法会完整遍历原始列表,把所有符合筛选条件的元素写入全新的列表,全程不会修改原列表的结构,也不会出现元素被跳过的问题,得到的是符合预期的筛选结果。
示例说明
比如我们要从列表[1,2,2,3]中删除所有偶数:
直接遍历修改原列表的代码
a = [1,2,2,3] for x in a: if x % 2 == 0: a.remove(x) print(a) # 实际输出:[1, 2, 3]
遍历到索引1的元素2时执行删除,列表变为[1,2,3],下一轮循环直接从索引2开始取值,原本索引1位置的第二个2就被跳过,导致没有被删除。
列表推导式写法
a = [1,2,2,3] a = [x for x in a if x%2 != 0] print(a) # 实际输出:[1, 3]
全程遍历原始列表的所有元素,不会出现跳过的问题,结果符合预期。
内容的提问来源于stack exchange,提问作者nz_21
相关产品推荐
相关产品推荐

