如何移除字符串列表中的nan值、重复元素并处理首尾空格?
问题描述
现有一个包含nan值和重复元素的字符串列表:
classes = [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, ' L-glutamate ', nan, nan, nan, nan, ' L-lysine ', nan, nan, nan, nan, nan, nan, nan, ' dihydroxyacetone', nan, nan, nan, ' CoA ', ' CoA ', ' CoA ', ' CoA ', ' CoA ', nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, ' hydrogen sulfide ', nan, nan, nan, nan, ' CoA ', ' CoA ', nan, nan, nan, ' formate ', nan, nan, nan]
需求:
- 移除列表中的
nan值和重复元素,得到中间结果:
[' L-glutamate ', ' L-lysine ', ' dihydroxyacetone', ' CoA ', ' hydrogen sulfide ', ' formate ']
- 进一步去除每个字符串的首尾空格(保留中间空格),最终得到:
['L-glutamate', 'L-lysine', 'dihydroxyacetone', 'CoA', 'hydrogen sulfide', 'formate']
尝试以下两段代码均报错TypeError: 'float' object is not iterable:
nan = float('nan') ll = [[i for i in j if i == i] for j in classes]
nan = float('nan') ll = [[x for x in y if type(x) != float or not math.isnan(x)] for y in classes]
解决方案
报错原因
你误用了双层列表推导式,把classes中的每个元素(比如nan是float类型)当成可迭代对象去遍历,但float无法被迭代,因此触发错误。只需单层遍历处理每个元素即可。
实现代码
以下是整合所有需求的代码:
import math # 显式声明nan为float类型,定义完整列表 classes = [float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), ' L-glutamate ', float('nan'), float('nan'), float('nan'), float('nan'), ' L-lysine ', float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), ' dihydroxyacetone', float('nan'), float('nan'), float('nan'), ' CoA ', ' CoA ', ' CoA ', ' CoA ', ' CoA ', float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), float('nan'), ' hydrogen sulfide ', float('nan'), float('nan'), float('nan'), float('nan'), ' CoA ', ' CoA ', float('nan'), float('nan'), float('nan'), ' formate ', float('nan'), float('nan'), float('nan')] # 步骤1:过滤nan值,同时去除字符串首尾空格 filtered_items = [item.strip() for item in classes if item == item] # 步骤2:去重并保留元素首次出现的顺序(Python3.7+字典默认有序) final_result = list(dict.fromkeys(filtered_items)) print(final_result)
代码说明
- 过滤nan值:利用
nan的特性——nan != nan,item == item会自动排除所有nan;同时调用strip()方法去除字符串首尾的空格,中间空格不受影响。 - 去重并保序:
dict.fromkeys(filtered_items)会创建一个以过滤后元素为键的有序字典,字典的键自动去重,最后转成列表即可得到去重且保序的结果。
替代写法(用math.isnan判断)
如果不想依赖nan != nan的特性,也可以用math.isnan做显式判断:
import math filtered_items = [item.strip() for item in classes if not (isinstance(item, float) and math.isnan(item))] final_result = list(dict.fromkeys(filtered_items))
内容的提问来源于stack exchange,提问作者yan wang
相关产品推荐
相关产品推荐

