计算列表中所有数字的平均值等于或大于50?

时间:2018-09-23 08:40:54

标签: python

我想返回一个函数,该函数给出所有等于或大于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。

6 个答案:

答案 0 :(得分:16)

尝试一下:

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)))

没有统计模块。

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

答案 1 :(得分:14)

除了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)

答案 2 :(得分:9)

回答以下问题:

  

请帮助我找出代码中的问题

问题在于:

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 ) = 1average也会包含一个整数,而不是列表。

我很想知道您使用的是哪个版本的Python,该版本可以使该代码正确执行。

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

答案 3 :(得分:1)

实际上,您提供的代码不会在您声明时返回空列表,它实际上是用TypeError断言的,假设您实际上是在调用 { {1}}函数,您的代码中不清楚的内容:

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 变量传递给了intsum()函数需要迭代,因为它会在每个项目上进行迭代以计算总和-您无法在单个整数上进行迭代(即使您可以, sum()也会失败,因为len()类型没有这样的功能:

int

您尝试对TypeError: object of type 'int' has no len() 执行此操作的原因是因为该构造:

int

将遍历该列表,依次为每个元素设置for variable in [3,1,4,1,5,9]: 。因此,variable将是variable,无法受到intsum()的影响。


就解决该问题而言,以下功能为您提供了所需的一般解决方案:所有数字的平均值大于或等于某个阈值,如果没有可用数字,则可以得到特定结果(默认为{ {1}}):

len()

对于您的特定情况,您可以使用类似的名称来调用它(我们假设此处空列表的平均值应该为零):

None

答案 4 :(得分:1)

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

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

要解释您的代码出了什么问题:

  • 您要对迭代器(整数)求平均值。

  • 而且您也得到了它的长度,因为它是整数,所以您无法得到它的长度。

答案 5 :(得分:0)

存储值并在以后计算平均值,而不是尝试在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()