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

16

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

2
对于标题中的问题,OP可以只需过滤计算平均值。您不需要再提供答案。 - user202729
1
还要记得指定你使用的Python版本,可以用 [tag:python-2.7] 或 [tag:python-3.x] 标签。/ 在两个版本中的行为是不同的。 - user202729
6个回答

17

试一试:

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

没有统计模块。

你的代码不起作用是因为你在求迭代器(一个整数)的总和,而不是列表,所以这就是为什么它不起作用。


15

除了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__ :-) - U13-Forward
再次强调(参见U9答案的评论),le 应该改为 lt(或者是“小于”的其他符号)。 - paxdiablo
我认为如果你感兴趣的话,op 模块提供了稍微更标准的“运算符作为函数”。 - D. Ben Knoble

11

回答以下问题:

请帮我找出代码中的问题

问题出在以下代码行:

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版本允许此代码执行而不出错。

这些错误已经得到了更正。


2

实际上,您提供的代码并不像您所说的那样返回一个空列表,它实际上会因为 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

可能你认为它打印空列表是因为没有输出,但除非你调用测试函数,否则不会有任何输出,因为你提供的代码只定义了两个函数,什么也没做。
当调用时,你的代码断言失败的原因只是因为你将一个非可迭代的整数变量传递给了sum()。sum()函数需要一个可迭代对象,因为它会遍历每个项目来计算总和 - 你不能遍历单个整数(即使你可以,len()函数也会失败,因为int类型没有这样的函数)。
TypeError: object of type 'int' has no len()

你试图对一个 int 进行这样的操作的原因是因为这个结构:

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

这段代码会遍历列表,将variable依次设置为每个元素。因此,variable将是一个int,无法被sum()len()使用。


关于修复它,以下函数为您提供了一个通用解决方案,即所有大于或等于特定阈值的数字的平均值,并允许在没有数字可用时提供特定结果(默认为None):

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

2
几乎所有其他内容都已涵盖,filter 在这里也有用途。
l = list(filter(lambda x: x >= 50, marks))
print('%.2f' % (sum(l)/len(l)))
71.83

解释代码中存在的问题:

  • 你正在将迭代器(整数)相加以求平均值。

  • 同时,你还在获取它的长度,但由于它是一个整数,因此无法这样做。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接