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

Posted

技术标签:

【中文标题】计算列表中所有大于等于 50 的数字的平均值?【英文标题】:Compute the average of all numbers in a list that are 50 or greater? 【发布时间】: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

【问题讨论】:

对于标题中的问题,OP可以filter out和compute average。您无需再次提供答案。 还记得使用python-2.7 或python-3.x 标记指定您正在使用的Python 版本。 / 在两个版本中的行为不同。 【参考方案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 模块提供了更标准的«操作符作为函数»。

以上是关于计算列表中所有大于等于 50 的数字的平均值?的主要内容,如果未能解决你的问题,请参考以下文章

计算工资大于2500的平均值

SQL语句查询:查询满足第1个字段等于某值且第2个字段大于某值的所有记录中,统计第3个字段的平均值。

sql: 联系题26 ,27查询平均成绩大于等于 85 的所有学生的学号姓名和平均成绩,查询课程名称为「数学」,且分数低于 60 的学生姓名和分数

计算第一个数字相似的所有元组值的平均值

输出空白——Java程序计算数组的平均值

Mysql多表联查——经典50题