为了账号安全,请及时绑定邮箱和手机立即绑定

试图找到偶数和奇数列表的中位数,函数为两者返回相同的答案

试图找到偶数和奇数列表的中位数,函数为两者返回相同的答案

偶然的你 2024-01-27 14:48:22
我正在尝试找到偶数和奇数列表的中位数。这是一个很长的故事,但我必须以这种方式找到中位数(不导入任何东西)。当我传入 myOddList 作为参数时,中位数是 3(正确)。然而,当我传入 myEvenList 作为参数时,我再次得到 3。如何让 myEvenList 正常工作并输出 3.5?myOddList = [1, 2, 3, 4, 5]myEvenList = [1, 2, 3, 4, 5, 6]def medianCalculator(myEvenList):    myOddList.sort()    myEvenList.sort()    n = len(myOddList)    s = len(myEvenList)    if n % 2 != 0:        answerOdd = myOddList[int(n/2)]        return answerOdd    else:        one = myEvenList [(s-1) // 2]        two = myEvenList [(s+1) // 2]        answerEven = (one + two) / 2        return answerEvenmedianForEvenList = medianCalculator(myEvenList)print(medianForEvenList)也许问题是我没有正确返回答案?
查看完整描述

4 回答

?
FFIVE

TA贡献1797条经验 获得超6个赞

问题:

  • 您正在访问myEvenListand myOddListinside medianCalculator,但您不应该这样做。medianCalculator应与任何外部变量分离。

  • 参数myEvenList隐藏myEvenList全局变量

  • 您决定运行偶数还是奇数算法取决于n,它是根据 计算的myOddList,因此它始终只运行两侧之一。

  • 不要调用sort()参数,因为它会修改底层列表。先复印一份。

解决方案:

  • 让你的medianCalculator函数没有副作用。这意味着,它不应该访问其自身函数之外的任何变量,而只能对其输入参数进行操作。

  • medianCalculator如果您想获得多个答案,请多次致电。使用不同的参数让它在不同的输入上运行。

代码:

myOddList = [1, 2, 3, 4, 5]

myEvenList = [1, 2, 3, 4, 5, 6]


def medianCalculator(myList):

    myList = myList.copy()

    myList.sort()

    n = len(myList)

    if n % 2 != 0:

        answerOdd = myList[int(n/2)]

        return answerOdd

    else:

        one = myList [(n-1) // 2]

        two = myList [(n+1) // 2]

        answerEven = (one + two) / 2

        return answerEven


medianForEvenList = medianCalculator(myEvenList)

print(medianForEvenList)

medianForOddList = medianCalculator(myOddList)

print(medianForOddList)


查看完整回答
反对 回复 2024-01-27
?
慕容708150

TA贡献1831条经验 获得超4个赞

myOddList = [1, 2, 3, 4, 5]

myEvenList = [1, 2, 3, 4, 5, 6]


def median(lst):

    

    lst = sorted(lst)

    

    lst_length = len(lst)

    midpoint = lst_length/2

    

    if lst_length % 2 != 0:

        return lst[int(midpoint-0.5)]

    else:

        return (lst[int(midpoint-0.5)] + lst[int(midpoint+0.5)])/2

    

print(median(myOddList))

# 3

print(median(myEvenList))

# 3.5


查看完整回答
反对 回复 2024-01-27
?
BIG阳

TA贡献1859条经验 获得超6个赞

你得到 3 因为你忽略了myEvenList


n = len(myOddList)

if n % 2 != 0:  # always true

    answerOdd = myOddList[int(n/2)] 

    return answerOdd  # return 3

不要在函数中使用两个列表,而只使用给定的参数


查看完整回答
反对 回复 2024-01-27
?
缥缈止盈

TA贡献2041条经验 获得超4个赞

首先你创建一个 def,所以不要在那里创建你的列表,其次你应该定义一个 def 参数,因为你稍后想要使用。


def median_cal (my_list) : 


    my_list.sort()

    n = len(my_list)


    if n % 2 != 0 :

        x = int(n/2) 

        answer = my_list[x]

        print (answer)


    else : 

        x = int(n/2) - 1 

        y = int(n/2)  

        answer = my_list[x] + my_list[y]

        print (answer/2)


a = [1,2,3]

b = [1,2,3,4]


median_cal(a)

median_cal(b)


查看完整回答
反对 回复 2024-01-27
  • 4 回答
  • 0 关注
  • 98 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信