为何re模块无法从DataFrame列名列表中移除指定值?
遍历列表删除元素时的异常原因分析
核心问题出在你遍历列表的同时直接修改(删除)原列表元素,导致索引错位,部分待删项被循环跳过。
具体原因拆解
假设你的列名列表是类似 ['D1S2', 'Pos', 'D3S4', 'RH', ...] 的结构:
- 当循环到索引1的
'Pos'并删除它后,列表长度变短,原本在索引3的'RH'会自动前移到索引2的位置。 - 但循环是按原列表的索引顺序推进的,下一次会检查索引2的元素(也就是原来的
'D3S4'),直接跳过了现在处于索引2的'RH',导致它没被删除。 - 这就是为什么5个待删项只删掉了3个——剩下的两个因为索引错位被循环漏过了。
为什么第二个方法(新建列表添加符合项)能正常工作?
因为你没有修改原列表,只是遍历原列表的所有元素,把符合正则D(\d+)S(\d+)的项筛选出来放到新列表里。整个过程中原列表的结构和索引都没变化,不会出现元素被跳过的情况,自然能得到正确结果。
正确的删除方式
如果一定要在原列表上删除不符合条件的元素,倒序遍历索引是可行的方案:
import re # 假设cols是你的列名列表 cols = ['D1S2', 'Pos', 'D3S4', 'RH', 'D5S6', 'Temp'] pattern = re.compile(r'D(\d+)S(\d+)') # 从最后一个元素往前遍历 for i in range(len(cols)-1, -1, -1): if not pattern.match(cols[i]): del cols[i] print(cols) # 输出: ['D1S2', 'D3S4', 'D5S6']
倒序遍历时,删除后面的元素不会影响前面元素的索引,所有待删项都会被检查到。
内容的提问来源于stack exchange,提问作者Jen
相关产品推荐
相关产品推荐

