鱼C论坛

 找回密码
 立即注册
查看: 32|回复: 1

[已解决]中位数问题,列表排序问题

[复制链接]
发表于 昨天 16:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. def getnum():
  2.     nums = []
  3.     inumstr = input("请输入数字(回车退出):")
  4.     while inumstr != "":
  5.         nums.append(eval(inumstr))
  6.         inumstr = input("请输入数字(回车退出):")
  7.     return nums

  8. def mean(numbers):
  9.     s = 0.0
  10.     for num in numbers:
  11.         s = s +num
  12.     return s / len(numbers)

  13. def dev(numbers,mean):
  14.     sdev = 0.0
  15.     for num in numbers:
  16.         sdev = sdev + (num -mean) ** 2
  17.     return pow(sdev / (len(numbers) - 1),0.5)

  18. def median(numbers):
  19.     sorted(numbers)
  20.     size = len(numbers)
  21.     if size % 2 == 0:
  22.         med = (numbers[size // 2 - 1] + numbers[size // 2]) / 2
  23.     else:
  24.         med = numbers[size // 2]
  25.     return med
  26. n = getnum()
  27. m = mean(n)
  28. print("平均值:{},方差:{:.2},中位数:{}。".format(m, dev(n,m), median(n)))
复制代码

输入9 4 56 5 1 6 26      和输入    1 4 5 6 9 26 56   中位数的输出结果会不同
最佳答案
昨天 16:09
您好!关于您的中位数问题,代码中存在几个错误,导致中位数计算不正确。主要问题在于 median 函数没有正确排序列表,并且索引使用有误。下面我将逐步解释并提供修正后的代码。

问题分析:
- 在 median 函数中,sorted(numbers) 没有改变原列表,因为它返回一个新列表,但您没有将其赋值给变量。
- 在计算中位数时,您直接使用了未排序的列表 numbers,导致索引访问错误。
- 此外,getnum 函数中 nums = 未初始化,应改为 nums = []

修正后的代码:
以下是修正后的完整代码,主要修复了中位数计算和列表初始化问题:


  1. def getnum():
  2.     nums = []
  3.     inumstr = input("请输入数字(回车退出):")
  4.     while inumstr != "":
  5.         nums.append(eval(inumstr))
  6.         inumstr = input("请输入数字(回车退出):")
  7.     return nums

  8. def mean(numbers):
  9.     s = 0.0
  10.     for num in numbers:
  11.         s = s + num
  12.     return s / len(numbers)

  13. def dev(numbers, mean):
  14.     sdev = 0.0
  15.     for num in numbers:
  16.         sdev = sdev + (num - mean) ** 2
  17.     return pow(sdev / (len(numbers) - 1), 0.5)

  18. def median(numbers):
  19.     sorted_nums = sorted(numbers)  # 排序列表并赋值
  20.     size = len(sorted_nums)
  21.     if size % 2 == 0:
  22.         med = (sorted_nums[size//2 - 1] + sorted_nums[size//2]) / 2
  23.     else:
  24.         med = sorted_nums[size//2]
  25.     return med

  26. n = getnum()
  27. m = mean(n)
  28. print("平均值:{},标准差:{:.2f},中位数:{}。".format(m, dev(n, m), median(n)))
复制代码


关键修改说明:
- 在 median 函数中,使用 sorted_nums = sorted(numbers) 对列表排序,并正确计算中位数索引。
- 修复了 getnum 中的列表初始化。
- 在打印语句中,将“方差”改为“标准差”,因为 dev 函数计算的是标准差(方差的平方根)。如果您需要方差,可以修改 dev 函数。

为什么输入不同列表输出不同?
- 原始代码中,由于未排序列表,中位数计算依赖于输入顺序。例如:
  - 输入 [9, 4, 56, 5, 1, 6, 26](未排序)时,错误地返回了原列表的中间值(例如索引3的值5)。
  - 输入 [1, 4, 5, 6, 9, 26, 56](已排序)时,可能偶然正确,但这不是可靠的方法。
- 修正后,无论输入是否排序,中位数都会先排序再计算,确保结果正确。

如果您还有其他问题,欢迎继续提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 昨天 16:09 | 显示全部楼层    本楼为最佳答案   
您好!关于您的中位数问题,代码中存在几个错误,导致中位数计算不正确。主要问题在于 median 函数没有正确排序列表,并且索引使用有误。下面我将逐步解释并提供修正后的代码。

问题分析:
- 在 median 函数中,sorted(numbers) 没有改变原列表,因为它返回一个新列表,但您没有将其赋值给变量。
- 在计算中位数时,您直接使用了未排序的列表 numbers,导致索引访问错误。
- 此外,getnum 函数中 nums = 未初始化,应改为 nums = []

修正后的代码:
以下是修正后的完整代码,主要修复了中位数计算和列表初始化问题:


  1. def getnum():
  2.     nums = []
  3.     inumstr = input("请输入数字(回车退出):")
  4.     while inumstr != "":
  5.         nums.append(eval(inumstr))
  6.         inumstr = input("请输入数字(回车退出):")
  7.     return nums

  8. def mean(numbers):
  9.     s = 0.0
  10.     for num in numbers:
  11.         s = s + num
  12.     return s / len(numbers)

  13. def dev(numbers, mean):
  14.     sdev = 0.0
  15.     for num in numbers:
  16.         sdev = sdev + (num - mean) ** 2
  17.     return pow(sdev / (len(numbers) - 1), 0.5)

  18. def median(numbers):
  19.     sorted_nums = sorted(numbers)  # 排序列表并赋值
  20.     size = len(sorted_nums)
  21.     if size % 2 == 0:
  22.         med = (sorted_nums[size//2 - 1] + sorted_nums[size//2]) / 2
  23.     else:
  24.         med = sorted_nums[size//2]
  25.     return med

  26. n = getnum()
  27. m = mean(n)
  28. print("平均值:{},标准差:{:.2f},中位数:{}。".format(m, dev(n, m), median(n)))
复制代码


关键修改说明:
- 在 median 函数中,使用 sorted_nums = sorted(numbers) 对列表排序,并正确计算中位数索引。
- 修复了 getnum 中的列表初始化。
- 在打印语句中,将“方差”改为“标准差”,因为 dev 函数计算的是标准差(方差的平方根)。如果您需要方差,可以修改 dev 函数。

为什么输入不同列表输出不同?
- 原始代码中,由于未排序列表,中位数计算依赖于输入顺序。例如:
  - 输入 [9, 4, 56, 5, 1, 6, 26](未排序)时,错误地返回了原列表的中间值(例如索引3的值5)。
  - 输入 [1, 4, 5, 6, 9, 26, 56](已排序)时,可能偶然正确,但这不是可靠的方法。
- 修正后,无论输入是否排序,中位数都会先排序再计算,确保结果正确。

如果您还有其他问题,欢迎继续提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-6 03:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表