如何使用Python中的函数为带有列表的算术运算返回结果

时间:2019-01-02 02:07:13

标签: python types statistics

我正在尝试计算整数列表的均值,中位数和众数。但是,我得到的错误(根据我的理解)指出我无法返回浮点答案。我不明白为什么列表会出现这种情况。我正在做的是对均值和中位数进行基本的算术运算(使用用于模式的统计框架)。输出应该只是一个答案。

这是我的代码:

from statistics import mode

listOfNumbers = [1, 2, 6, 7, 8, 9, 3, 4, 5, 10, 10]
listOfNumbers.sort()
length = len(listOfNumbers)

def median(numbers):
  if((len(list)) % 2 == 0):
    median = (listOfNumbers[(length)/2] + listOfNumbers[(length)/2-1]) / 2
  else:
    median = listOfNumbers[(length-1)/2]
  return

def meanMedianMode(numbers):
    # TODO your code here!
    meanOfNumbers = (sum(numbers))/(len(numbers))
    medianOfNumbers = median(numbers)
    modeOfNumbers = mode(numbers)
    print("The mean of the numbers is: " + str(meanOfNumbers))
    print("The median of the numbers is: " + str(medianOfNumbers))
    print("The mode of the numbers is: " + str(modeOfNumbers))

meanMedianMode(listOfNumbers)

这是我的输出:

TypeError                                 Traceback (most recent call last)
<ipython-input-27-03d94981e27d> in <module>()
     21     print("The mode of the numbers is: " + str(modeOfNumbers))
     22 
---> 23 meanMedianMode(listOfNumbers)
     24 

<ipython-input-27-03d94981e27d> in meanMedianMode(numbers)
     15     # TODO your code here!
     16     meanOfNumbers = (sum(numbers))/(len(numbers))
---> 17     medianOfNumbers = median(numbers)
     18     modeOfNumbers = mode(numbers)
     19     print("The mean of the numbers is: " + str(meanOfNumbers))

<ipython-input-27-03d94981e27d> in median(numbers)
      9     median = (listOfNumbers[(length)/2] + listOfNumbers[(length)/2-1]) / 2
     10   else:
---> 11     median = listOfNumbers[(length-1)/2]
     12   return
     13 

TypeError: list indices must be integers or slices, not float

2 个答案:

答案 0 :(得分:0)

问题出在这一行:

median = listOfNumbers[(length-1)/2]

在python 3中,(length-1)/2float,而不是int,因此错误list indices must be integers or slices, not float

最简单的解决方法是将结果投射回int

...
median = listOfNumbers[int((length - 1) / 2)]
...

实际上,我将像这样重构整个median()函数,因为您要混合使用局部变量和全局变量,而不返回任何内容:

def median(numbers):
    length = len(numbers)
    if length % 2 == 0:
        return (listOfNumbers[int(length / 2)] + listOfNumbers[int(length / 2) - 1]) / 2
    else:
        return listOfNumbers[int((length - 1) / 2)]

答案 1 :(得分:0)

好的解决方法:

    median_value = numbers[int((length - 1 )/2)]
    return median_value

这里有几件事...

  1. numbers [x]表示数字中的第x个元素,因此5.5之类的值不会指向任何东西。

  2. 6.0仍然是一个十进制数字(或浮点数),我们需要一个整数,因此请使用int()使其现在为6。

  3. 理想情况下,您希望中​​值函数在列表通过后返回这些值(因此返回中值)

您还必须对if语句的另一部分做同样的事情(在此运行中不执行)。

   median_value = (numbers[int((length - 1)/2))] + numbers[int((length + 1)/2)]) / 2
   return median_value