若要查找奇偶列表的中间值,函数将为这两个列表返回相同的答案

2024-09-28 19:04:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图找到一个偶数和奇数列表的中间值。说来话长,但我必须以这种方式找到中间值(不导入任何内容)

当我传入myodList作为参数时,中间值是3(正确)。然而,当我传入MyEventList作为参数时,我又得到了3。如何使MyEventList正常工作并具有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 answerEven

medianForEvenList = medianCalculator(myEvenList)
print(medianForEvenList)

也许问题是我的回答不正确


Tags: 参数lenreturnsortone奇数偶数two
3条回答

问题:

  • 您正在访问myEvenListmyOddList内的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)

你得到3分是因为你忽略了myEvenList

n = len(myOddList)
if n % 2 != 0:  # always true
    answerOdd = myOddList[int(n/2)] 
    return answerOdd  # return 3

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

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

相关问题 更多 >