You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 14:06:03