使用for循环移除列表非字符串元素时误删字符串的问题
解决遍历列表移除非字符串元素时的异常问题
错误原因分析
你的代码存在两个核心问题:
- 类型判断逻辑错误:
type(item) != 'str'是错误的判断方式——type(item)返回的是类型对象(比如<class 'str'>),和字符串'str'比较永远不相等,导致所有元素都被判定为非字符串,触发移除操作。 - 遍历原列表时直接修改:在
for item in Forex_ticker循环中直接删除元素,会导致列表长度动态变化,迭代器索引错位,跳过部分元素,最终出现字符串被误删的情况。
正确解决方案
方案1:遍历列表副本,修正类型判断
遍历原列表的副本,避免修改原列表影响循环迭代,同时用isinstance正确判断字符串类型:
Forex_ticker = list(currency.unique()) # 遍历列表的副本,确保循环不受原列表修改影响 for item in Forex_ticker.copy(): # isinstance能正确识别字符串类型,包括子类场景 if not isinstance(item, str): Forex_ticker.remove(item)
方案2:列表推导式(推荐,简洁高效)
直接生成仅包含字符串元素的新列表,不需要修改原列表:
Forex_ticker = [item for item in currency.unique() if isinstance(item, str)]
方案3:使用filter函数
通过filter过滤出字符串元素,再转为列表:
Forex_ticker = list(filter(lambda x: isinstance(x, str), currency.unique()))
验证效果
执行上述任意方案后,Forex_ticker会正确保留所有字符串元素,移除nan:
['CADCAD', 'CADCHF', 'CADEUR', 'CADGBp', 'CADUSD', 'CADNOK', 'CADMXN']
内容的提问来源于stack exchange,提问作者Varun Agrawal
相关产品推荐
相关产品推荐

