列表理解有效,但 for 循环无效——为啥?

Posted

技术标签:

【中文标题】列表理解有效,但 for 循环无效——为啥?【英文标题】:List comprehension works but not for loop––why?列表理解有效,但 for 循环无效——为什么? 【发布时间】:2016-12-26 22:21:03 【问题描述】:

我对自己有点恼火,因为我不明白为什么一个问题的解决方案有效而另一个无效。如,它表明我对(基本)熊猫的理解不足,这让我很生气!

无论如何,我的问题很简单:我有一个“坏”值列表(“bad_index”);这些对应于我想删除相应行的数据帧('data_clean1')上的行索引。但是,由于每个新数据集的值都会发生变化,因此我不想将错误值直接插入代码中。这是我首先做的:

bad_index = [2, 7, 8, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 24, 29]

for i in bad_index:
    dataclean2 = dataclean1.drop([i]).reset_index(level = 0, drop = True)

但这没有用; data_clean2 与 data_clean1 完全相同。我的第二个想法是使用列表推导(如下);结果很好。

bad_index = [2, 7, 8, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 24, 29]

data_clean2 = data_clean1.drop([x for x in bad_index]).reset_index(level = 0, drop = True)

现在,为什么列表理解方法有效,而不是“for”循环?我已经编码了几个月,我觉得我不应该犯这些错误。

谢谢!

【问题讨论】:

我不确定drop 做了什么,但我知道在for loop 中,您在每次迭代期间都会重新分配dataclean2 你的意思是列表理解而不是正则表达式?就是否犯错误而言,我已经编码多年,仍然遇到我不理解的问题,并且犯了我觉得我不应该犯的错误!我希望我能告诉你,错误会随着时间的推移而消失...... 是的,为清楚起见进行了编辑! 【参考方案1】:

data_clean1.drop([x for x in bad_index]).reset_index(level = 0, drop = True) 相当于简单地将bad_index 列表传递给drop

data_clean1.drop(bad_index).reset_index(level = 0, drop = True)

drop 接受一个列表,并删除列表中存在的每个索引。

您的显式for 循环不起作用,因为在每次迭代中,您只是从dataclean1 数据帧中删除了一个不同的索引,而没有保存中间数据帧,所以到最后一次迭代dataclean2 只是执行的结果dataclean2 = dataclean1.drop(29).reset_index(level = 0, drop = True)

【讨论】:

哦,这就是我没有完全阅读问题+1好的答案而得到的结果 很好的答案——谢谢!这很好地阐明了这一点。有趣的是,我永远不会在遍历列表时犯这个错误。但至少我不会再犯了……【参考方案2】:

编辑:事实证明这不是你的问题......但如果你没有在 Deepspace 的另一个答案中提到的问题,那么你会遇到这个问题

for i in bad_index:
    dataclean2 = dataclean1.drop([i]).reset_index(level = 0, drop = True)

想象你的坏索引是[1,2,3],你的数据清理是[4,5,6,7,8]

现在让我们逐步了解实际发生的情况

初始:dataclean == [4,5,6,7,8]

loop0 : i == 1 => 删除索引 1 ==>dataclean = [4,6,7,8]

loop1 : i == 2 => 删除索引 2 ==> dataclean = [4,6,8]

loop2 : i ==3 ==> 删除索引 3 !!!!呃哦没有索引3


我猜你可以这样做

for i in reversed(bad_index):
    ...

这样,如果你先删除 index3,它不会影响索引 1 和 2

但一般来说,您不应在迭代列表/字典时对其进行变异

【讨论】:

以上是关于列表理解有效,但 for 循环无效——为啥?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 sorted(by:) 有效但 sort(by:) 在 ForEach 循环中无效

展开循环有效,for循环无效[重复]

为啥将 np.concatenate 与 for 循环和列表理解一起使用的结果不一样?

为啥 for 循环中的这种无效语法? [复制]

为啥通过for循环插入时List中的代表总是相等但没有循环时不相等

Python for循环内变量自增为啥没有效果?