如何用Quicksort算法对字典列表按sale_number排序?报错求解
字典列表按sale_number快速排序的错误修复与实现
错误原因
- 直接报错点:
list_devices(sale_number)把列表当作函数调用(用了圆括号),列表是不可调用对象,触发TypeError。同时这里的逻辑完全错误,你需要访问的是列表中每个字典的sale number键,而非全局变量sale_number。 - 排序逻辑缺失:原函数没有实现快速排序的核心——递归,只是简单分了左右就合并,且错误操作全局变量而非字典字段。
- 字典键名不一致:第三个字典的排序字段键是
number sale,和前两个的sale number不统一,会导致KeyError。
修正后的完整代码
先统一字典键名,再实现正确的递归快速排序:
# 统一字典键名,修复第三个字典的键名错误 device_list = [ {'device': 'laptop', 'quantity': 4, 'sale number': 20003, 'sale price': 337.0, 'sale total': 1348.0}, {'device': 'desktop ', 'quantity': 4, 'sale number': 20003, 'sale price': 292.5, 'sale total': 1170.0}, {'device': 'printer', 'quantity': 2, 'sale number': 20001, 'sale price': 173.75, 'sale total': 347.5} ] def quicksort_by_sale_number(list_devices): # 基线条件:列表长度<=1时直接返回 if len(list_devices) <= 1: return list_devices # 取第一个元素的sale number作为基准值 pivot = list_devices[0]['sale number'] left, center, right = [], [], [] # 遍历每个字典,按sale number分组 for item in list_devices: current_num = item['sale number'] if current_num < pivot: left.append(item) elif current_num == pivot: center.append(item) else: right.append(item) # 递归排序左右子列表,合并结果 return quicksort_by_sale_number(left) + center + quicksort_by_sale_number(right) # 测试排序 sorted_devices = quicksort_by_sale_number(device_list) for dev in sorted_devices: print(dev)
核心修复说明
- 修正列表调用错误:通过
item['sale number']正确提取每个字典的排序字段,不再错误调用列表。 - 添加递归逻辑:快速排序必须递归处理左右子列表,这是原代码缺失的核心。
- 统一键名:确保所有字典的排序字段键为
sale number,避免键不存在的错误。 - 保留完整字典结构:排序后返回的是完整的字典列表,而非仅数值,符合业务需求。
sale_number生成逻辑的注意事项
你的生成逻辑没问题,但要确保新生成的sale_record键名统一为sale number,避免后续排序出错:
correlative_number = int(input("Enter the sale registration number: ")) quantity = int(input("Enter the number of devices sold: ")) sale_number = 20000 + correlative_number # 键名严格统一为"sale number" sale_record = { "device": device, "amount": quantity, # 注意原代码的amount应该对应输入的quantity "sale number": sale_number, "sale price": sale_price, "sale total": total_sale } # 将新记录加入列表 device_list.append(sale_record)
内容的提问来源于stack exchange,提问作者Kiddo
相关产品推荐
相关产品推荐

