当前位置: 代码迷 >> python >> 计算列表中50或更大的所有数字的平均值?
  详细解决方案

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

热度:33   发布时间:2023-07-14 08:59:49.0

我想返回一个函数,它给出所有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。

尝试这个:

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

而且没有统计模块。

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

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

回答以下问题:

请帮我弄清楚代码中的问题

问题是:

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,它允许这些代码无误地执行。

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

实际上,你提供的代码并没有返回一个空列表,因为你声明它实际上是以一个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()函数需要一个iterable,因为它迭代每个项目来计算总和 - 你不能迭代一个整数(即使你可以, 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)))

几乎所有其他内容都被覆盖, filter在这里也有用处

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

要解释代码有什么问题:

  • 您将平均值的迭代器(整数)相加。

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

存储值并稍后计算平均值,而不是尝试计算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()
  相关解决方案