Python类型错误求助:排序Lane与Self实例列表时遇类型不匹配
问题修复与优化方案
报错根源
你碰到的Unexpected type(s): (set[Selfcheckout | int])错误,是因为调用dictionary.update()时传了集合{lane, len(lane.queue)},但dict.update()只接受两种合法参数:
- 由键值对组成的可迭代对象(比如元组列表)
- 另一个字典对象
集合不属于合法输入,所以触发类型错误。
代码冗余与风险分析
除了报错点,原代码还有两处没必要的操作和潜在问题:
- 用字典存储实例与队列长度,若两个实例的队列长度相同,后加入的会覆盖前者(字典键唯一),导致丢失有效数据
- 排序后转字典再遍历取键属于多余操作,直接从排序结果里提取实例即可
最简修复代码
无需借助字典,直接对列表按队列长度排序:
def getsortedopen(openqueues): # 先过滤出合法的Lane/Self实例 valid_queues = [lane for lane in openqueues if isinstance(lane, (Lane, Self))] # 按队列长度升序排序,直接返回排序后的实例列表 return sorted(valid_queues, key=lambda x: len(x.queue))
如果要保留原代码结构(不推荐),修正报错点后的写法:
def getsortedopen(openqueues): sort = [] dictionary = {} if isinstance(openqueues, list): for lane in openqueues: # 用or替代|,逻辑更符合Python规范 if isinstance(lane, Lane) or isinstance(lane, Self): # 直接给字典赋值,替代错误的update+集合写法 dictionary[lane] = len(lane.queue) # 按队列长度排序,得到(实例, 长度)的元组列表 sorted_items = sorted(dictionary.items(), key=lambda x: x[1]) # 直接从元组中提取实例,去掉冗余的字典转换 sort = [item[0] for item in sorted_items] return sort
关键修正点
- 把
{lane, len(lane.queue)}改成键值对形式{lane: len(lane.queue)},或者直接用dictionary[lane] = len(lane.queue)更简洁 - 用
isinstance(lane, (Lane, Self))替代isinstance(lane, Lane) | isinstance(lane, Self),写法更符合Python惯例 - 去掉无意义的
dict(dictionary)转换,直接从排序后的元组列表提取实例
内容的提问来源于stack exchange,提问作者panda
相关产品推荐
相关产品推荐

