2014-09-24 1 views
-2

Я пишу функцию в Python, которая берет список списков чисел и печатает средние значения в каждой строке. Но когда я это делаю, он печатает ответы, а затем дает блок ошибок, который я не могу найти на веб-сайте документации python.Функция в Python дает странный набор ошибок, но выводит правильный ответ

def avg(lst): 

    """lst is a list that contains lists of numbers; the 
    function prints, one per line, the average of each list""" 

    count = 0 
    while count<=(len(lst)): 
     print(sum(lst[count])/(len(lst[count]))) 
     count = count + 1 

Когда это будет работать с LST [[95, 92, 86, 87], [66, 54], [89, 72, 100], [33, 0, 0]], он дает выход:

>>> avg([[95, 92, 86, 87], [66, 54], [89, 72, 100], [33, 0, 0]]) 
90.0 
60.0 
87.0 
11.0 

Traceback (most recent call last): 
    File "<pyshell#38>", line 1, in <module> 
    avg([[95, 92, 86, 87], [66, 54], [89, 72, 100], [33, 0, 0]]) 
    File "<pyshell#37>", line 7, in avg 
    print(sum(lst[count])/(len(lst[count]))) 
IndexError: list index out of range 

Ответы правильные, но я не уверен, почему возникла эта ошибка. Есть идеи?

EDIT: изменена во время подсчета < (LEN (ЛСТ) + 1): в то время как рассчитывать < = (LEN (ЛСТ)): По-прежнему дает ту же ошибку

+0

Я изменил эту строку в то время как счетчик <= (Len (LST)): и он по-прежнему дает тот же набор ошибок –

+1

'count <= (len (lst))' такой же, как 'count <(len (lst) +1)' – khelwood

+2

'count <= (len (list))' это то же самое, что 'count <(LEN (ЛСТ) +1) '. Попробуйте 'count tdelaney

ответ

3

У Вас есть это:

while count<(len(lst)+1): 

Вы проходите мимо конца списка.

Ваша петля выполняет итерацию для каждого элемента в списке (дает вам правильный вывод), а затем делает еще одно, вызывая ошибку.

Избавьтесь от +1.

+0

Я изменил эту строку на число <= (len (lst)): и он по-прежнему дает тот же набор ошибок –

+1

'count <= (len (lst))' такой же, как 'count <(len (lst) +1) '. Используйте 'count khelwood

+0

Спасибо! Я буду отмечать как правильный ответ. –

0

Вы можете достичь функциональности, которую вы ищете, определив ваши функции как:

mean = lambda x: sum(x)/float(len(x)) 
avg = lambda x: map(mean, x) 

Теста как:

>>> avg([[95, 92, 86, 87], [66, 54], [89, 72, 100], [33, 0, 0]]) 
[90.0, 60.0, 87.0, 11.0] 

Индекс из Границы ошибок происходит из-за беловатого-по -one ошибка в строке while count<(len(lst)+1):. Условие должно быть while count<(len(lst)):.

+0

lookitchoo, с лямбдой! :) – TML

2

Вы также можете использовать цикл for вместо цикла while; в дополнение к устранению возможности для ошибки fencepost, код просто легче читать (ИМО):

def avg(lst): 
    for l in lst: print(sum(l)/len(l)) 
avg([[95, 92, 86, 87], [66, 54], [89, 72, 100], [33, 0, 0]]) 
Смежные вопросы