【问题标题】:Compute the average of all numbers in a list that are 50 or greater?计算列表中所有大于等于 50 的数字的平均值?
【发布时间】:2019-02-27 02:05:08
【问题描述】:

我想返回一个函数,该函数给出50 或更多标记的平均值。当我运行我的代码时,它总是返回一个空列表。

这是我尝试过的:

def get_pass_average(marks):
    average = []
    for count in marks:
        if count >= 50:
           average = sum(count) / len(count)          
    return round(average,2)

def test_get_pass_average():
    list1 = [50, 83, 26, 65, 92, 29, 77, 64]
    print('%.2f' % (get_pass_average(list1)))

请帮我找出代码中的问题,输出应该是71.83

【问题讨论】:

标签: python list list-comprehension average


【解决方案1】:

存储值并稍后计算平均值,而不是尝试在 for 循环中计算平均值。

希望您正在寻找这个:

def get_pass_average(marks):
    marksAbove = []
    for count in marks:
        if count >= 50:
            marksAbove.append(count);

    average = sum(marksAbove) / len(marksAbove)  
    return round(average,2)

def test_get_pass_average():
    list1 = [50, 83, 26, 65, 92, 29, 77, 64]
    print('%.2f' % (get_pass_average(list1)))

# Init
test_get_pass_average()

【讨论】:

    【解决方案2】:

    几乎涵盖了其他所有内容,filter 在这里也有用处

    l = list(filter(lambda x: x >= 50, marks))
    print('%.2f' % (sum(l)/len(l)))
    
    71.83
    

    解释你的代码有什么问题:

    • 您正在对迭代器(整数)求和以获得平均值。

    • 你也得到了它的长度,你不能,因为它是一个整数。

    【讨论】:

      【解决方案3】:

      实际上,您提供的代码确实没有在您声明时返回一个空列表,它实际上使用TypeError 进行断言,假设您实际上调用 test_get_pass_average()功能,您的代码中不清楚的东西:

      Traceback (most recent call last):
        File "testprog.py", line 12, in <module>
          test_get_pass_average()
        File "testprog.py", line 10, in test_get_pass_average
          print('%.2f' % (get_pass_average(list1)))
        File "testprog.py", line 5, in get_pass_average
          average = sum(count) / len(count)          
      TypeError: 'int' object is not iterable
      

      您可能假设它会打印一个空列表,因为没有输出,但是除非您调用测试函数,否则不会有任何输出,仅仅是因为您提供的代码定义了两个函数,但没有做其他任何事情。

      您的代码断言(当您调用它时)的原因仅仅是因为您将不可迭代的int 变量传递给sum()sum() 函数需要一个可迭代对象,因为它遍历每个项目以计算总和 - 您不能遍历单个整数(即使您可以, len() 也会失败,因为 int type 没有这样的功能:

      TypeError: object of type 'int' has no len()
      

      您尝试对int 执行此操作的原因是因为构造:

      for variable in [3,1,4,1,5,9]:
      

      将遍历该列表,依次将variable 设置为每个元素。所以variable 将是一个int,不能服从sum()len()


      在修复它方面,以下函数为您提供了您需要的通用解决方案,所有大于或等于某个阈值的数字的平均值,如果没有可用数字,则允许特定结果(默认为 @ 987654337@):

      def AverageWithThreshold(myList, threshold, emptyResult = None):
          newList = [item for item in myList if item >= threshold]
          if len(newList) == 0: return emptyResult
          return sum(newList) / len(newList)
      

      对于您的具体情况,您可以用类似的方式调用它(我们假设空列表的平均值在这里应该为零):

      print('%.2f' % (AverageWithThreshold(list1, 50, 0)))
      

      【讨论】:

        【解决方案4】:

        试试这个:

        l=[i for i in list1 if i>=50]
        print(sum(l)/len(l))
        

        或者:

        from statistics import mean
        l=[i for i in list1 if i>=50]
        print(mean(l))
        

        如果想为空列表设置条件:

        l=[i for i in list1 if i>=50]
        if l:
            print(sum(l)/len(l))
        

        或者:

        from statistics import mean
        l=[i for i in list1 if i>=50]
        if l:
            print(mean(l))
        

        对于python 2:

        print(sum(l)/len(l))
        

        应该是:

        print(float(sum(l))/float(len(l)))
        

        而且没有统计模块。

        您的代码不起作用,因为您对迭代器(整数)而不是列表求和,所以这就是它不起作用的原因

        【讨论】:

          【解决方案5】:

          回答以下问题:

          请帮我找出代码中的问题

          问题是以下几行:

          for count in marks
              if count >= 50:
                  average = sum( count ) / len( count )
          

          marks 是一个整数列表。因此,当您循环 for count in marks 时,count 的值是一个整数。我在 Python 3.6.3 和 2.7.10 中测试了您的代码,您甚至不能在整数上调用 sum()len() 函数(如果您尝试,它们都会返回 TypeError)。

          您初始化average = [],因此您似乎希望average 包含一个列表,但即使sum( count ) = countlen( count ) = 1,那么average 包含一个整数,而不是一个列表。

          我很想知道您使用的哪个版本的 Python 允许此代码无错误地执行。

          这些错误的更正已经给出。

          【讨论】:

            【解决方案6】:

            除了U9-Forward的回答,一个使用filtermean

            from statistics import mean
            
            list1 = [50, 83, 26, 65, 92, 29, 77, 64]
            average = mean(filter((50).__le__, list1))
            print('%.2f' % average)
            

            【讨论】:

            • 也不错 :-),我想我 __le__ :-)
            • 再次(参见对 U9 答案的评论),le 可能应该是 lt(或任何“小于”)。
            • 如果您有兴趣,我认为op 模块提供了更标准的«操作符作为函数»。
            猜你喜欢
            • 1970-01-01
            • 2017-03-29
            • 2020-02-14
            • 1970-01-01
            • 2013-03-18
            • 1970-01-01
            • 2020-12-07
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多