Вычислить среднее значение всех чисел в списке, которые составляют 50 или больше?

Я хочу вернуть функцию, которая дает среднее значение для всех меток, которые составляют 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.

Ответ 1

Попробуй это:

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

И никакого модуля статистики.

Ваш код не работает, потому что вы суммируете итератор (целое число), а не список, чтобы почему он не работал

Ответ 2

В дополнение к ответу 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)

Ответ 3

Чтобы ответить на вопрос:

Пожалуйста, помогите мне разобраться с проблемами в моем коде

Проблема заключается в следующем:

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 вы используете, позволяя этот код выполнять без ошибок.

Исправления этих ошибок уже приведены.

Ответ 4

Фактически, код, который вы предоставили, не возвращает пустой список, как вы заявляете, он фактически утверждает с помощью 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 -iterable int 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)

Для вашего конкретного случая вы можете вызвать его с чем-то вроде (мы предполагаем, что среднее значение пустого списка должно быть здесь 0):

print('%.2f' % (AverageWithThreshold(list1, 50, 0)))

Ответ 5

Почти все остальное покрыто, filter также используется здесь

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

Чтобы объяснить, что не так с вашим кодом:

  • Вы суммируете итератор (целое число) для среднего.

  • А также вы получаете его длину, где вы не можете, потому что это целое число.

Ответ 6

Сохраняйте значения и вычисляйте среднее значение позже вместо того, чтобы пытаться вычислить средний цикл внутри цикла.

Надеюсь, вы это ищете:

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

Ответ 7

В APL:

ns←10×⍳10        ⍝ Let have a list of numbers, some of which are larger than 50
gt50←(50<ns)/ns  ⍝ Let have only those numbers that are greater than 50
(+/gt50) ÷ ⍴gt50 ⍝ Let have the sum of those numbers and divide that by the count of those numbers

Короче более прямая версия, которая ставит вопрос почти напрямую:

(+/÷⍴)ns/⍨ns>50 ⍝ sum divided by the count of ns where ns are greater than 50

https://tryapl.org/?a=%28+/%F7%u2262%29ns/%u2368ns%3E50&run