sorted()操作扩充列表无法求中位数,如何设置禁止空值加入列表
核心问题定位
你的代码有两处直接导致中位数计算错误的问题:
- 未校验输入有效性,若用户输入连续空格、首尾带空格,或者输入非数字内容,会导致后续转换、计算异常
- 你排序的对象是原始输入字符串
sorted(input_string),而非转换后的数字分数列表,完全用错了排序数据源,和空值关系不大
解决方法
空值过滤逻辑
分割输入后新增空值过滤步骤,即可避免空元素进入列表:
# split默认分割所有空白符,加if判断直接过滤所有空串 user_list = [item for item in input_string.split() if item.strip()]
完整修正代码
同时修复了你原有代码的输入校验死循环、排序对象错误、中位数计算逻辑错误的问题:
import statistics import time # 修复分数数量输入校验逻辑,超过10时要求重新输入 while True: amount = int(input('你要输入多少个分数?(最多10个)')) if amount <= 10: break print('输入错误,请输入不超过10的数字') time.sleep(1) print(f'输入的分数数量:{amount}') input_string = input('输入学生分数,用空格分隔:') print('\n') # 分割输入并过滤空值 raw_list = input_string.split() filter_list = [item.strip() for item in raw_list if item.strip()] # 校验输入数量是否匹配 if len(filter_list) != amount: print(f"输入错误:需要输入{amount}个分数,实际输入了{len(filter_list)}个") exit() # 转换为整数列表,校验是否有非数字输入 try: score_list = list(map(int, filter_list)) except ValueError: print("输入错误:包含非数字内容,请重新运行") exit() print(f'分数列表:{score_list}') print(f'平均值 = {sum(score_list)/amount:.2f}') # 对数字列表排序后计算中位数 sorted_score = sorted(score_list) print(f'排序后的分数列表:{sorted_score}') if amount % 2 == 0: median = (sorted_score[amount//2 - 1] + sorted_score[amount//2]) / 2 else: median = sorted_score[amount//2] print(f'中位数 = {median}')
内容的提问来源于stack exchange,提问作者Banana
相关产品推荐
相关产品推荐

