计算列表中所有大于等于 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 ) = count
和len( count ) = 1
,那么average
包含一个整数,而不是一个列表。
我很想知道您使用的哪个版本的 Python 允许此代码无错误地执行。
这些错误的更正已经给出。
【讨论】:
【参考方案6】:除了U9-Forward的回答,一个使用filter
和mean
:
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 的数字的平均值?的主要内容,如果未能解决你的问题,请参考以下文章
SQL语句查询:查询满足第1个字段等于某值且第2个字段大于某值的所有记录中,统计第3个字段的平均值。
sql: 联系题26 ,27查询平均成绩大于等于 85 的所有学生的学号姓名和平均成绩,查询课程名称为「数学」,且分数低于 60 的学生姓名和分数