Python处理混合int与str的设备部件列表排序时报错如何解决
错误原因
第一个类型错误(int不可迭代)
你在findSwParts方法中直接对可能为int类型的第三个分组字段执行in包含判断,in操作需要遍历目标对象,int类型不支持遍历,因此触发报错。
第二个类型错误(bool不可迭代)
大概率是你之前的循环逻辑中边遍历边删除列表元素,导致self.thisParts变量中途被修改为布尔类型,而非原本的列表类型,执行map(str, self.thisParts)时会尝试遍历布尔值触发报错。同时你自定义的遍历+删除逻辑存在索引错位问题:删除列表元素后,后续元素的索引会自动前移,固定range生成的索引会漏匹配、甚至引发索引越界。
可行解决方案
核心思路是先将列表按3个元素一组拆分,再统一提取每组的设备编号作为排序键,使用Python内置sorted函数完成排序,全程不修改原始列表结构,规避类型和索引问题。
实现代码
import re def sort_parts(self): # 1. 按3个元素一组拆分原始列表,自动忽略不足3个的残组 groups = [self.thisParts[i:i+3] for i in range(0, len(self.thisParts), 3)] # 2. 定义提取设备编号的排序键函数 def get_sort_key(group): # 统一将第三个元素转字符串,兼容int/str/bool所有类型 third_str = str(group[2]) # 正则提取第一个出现的数字作为设备编号 num_match = re.search(r'\d+', third_str) return int(num_match.group()) if num_match else 99999 # 无编号的组默认排最后 # 3. 排序:reverse=True为降序,False为升序,按需修改 sorted_groups = sorted(groups, key=get_sort_key, reverse=True) # 4. 若需要转回一维列表,赋值给orderedParts self.orderedParts = [item for group in sorted_groups for item in group]
兼容说明
- 不管第三个分组字段是
1/2这类int、"Switch 1"这类短字符串、还是"Switch 2 - FlexStackPlus Module"这类长字符串,都能正确提取编号排序 - 即使原始数据中混有布尔值,转字符串后无匹配数字会自动排在最后,不会触发类型错误
- 不需要提前对全列表做类型转换,避免破坏原始数据格式
内容的提问来源于stack exchange,提问作者hjacquemin
相关产品推荐
相关产品推荐

