735468682 发表于 2025-11-5 16:07:53

中位数问题,列表排序问题

def getnum():
    nums = []
    inumstr = input("请输入数字(回车退出):")
    while inumstr != "":
      nums.append(eval(inumstr))
      inumstr = input("请输入数字(回车退出):")
    return nums

def mean(numbers):
    s = 0.0
    for num in numbers:
      s = s +num
    return s / len(numbers)

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

def median(numbers):
    sorted(numbers)
    size = len(numbers)
    if size % 2 == 0:
      med = (numbers + numbers) / 2
    else:
      med = numbers
    return med
n = getnum()
m = mean(n)
print("平均值:{},方差:{:.2},中位数:{}。".format(m, dev(n,m), median(n)))

输入9 4 56 5 1 6 26      和输入    1 4 5 6 9 26 56   中位数的输出结果会不同

FishC 发表于 2025-11-5 16:09:37

您好!关于您的中位数问题,代码中存在几个错误,导致中位数计算不正确。主要问题在于 median 函数没有正确排序列表,并且索引使用有误。下面我将逐步解释并提供修正后的代码。

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

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


def getnum():
    nums = []
    inumstr = input("请输入数字(回车退出):")
    while inumstr != "":
      nums.append(eval(inumstr))
      inumstr = input("请输入数字(回车退出):")
    return nums

def mean(numbers):
    s = 0.0
    for num in numbers:
      s = s + num
    return s / len(numbers)

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

def median(numbers):
    sorted_nums = sorted(numbers)# 排序列表并赋值
    size = len(sorted_nums)
    if size % 2 == 0:
      med = (sorted_nums + sorted_nums) / 2
    else:
      med = sorted_nums
    return med

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


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

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 中位数问题,列表排序问题