2017-01-06 6 views
0

В настоящее время я изучаю, как кодировать python 2.7, но я столкнулся с запутанной ошибкой в ​​следующем коде, который пытается (очень неэффективно полагаю) возвращать медиана ввода.Почему len ([1]) дает мне ошибку «NoneType»

def median(lst): 

    lst = lst.sort() 
    median = 0 

    if len(lst) == 1: 
     median = lst[0]    
    elif len(lst) % 2 == 0: 
     median_sum = lst[len(lst)/2 - 1] + lst[len(lst)/2 + 1] 
     median = median_sum/2.0 
    else: 
     median = lst[len(lst)/ 2 - 1] 

    return median 

print median([1]) 

выше мой код, и он продолжает давать мне следующую ошибку:

Traceback (most recent call last): 
    File "C:/Python27/SAVED DOCS/test3.py", line 16, in <module> 
    print median([1]) 
    File "C:/Python27/SAVED DOCS/test3.py", line 6, in median 
    if len(lst) == 1: 
TypeError: object of type 'NoneType' has no len() 

кажется, что он испытывает проблемы с меня вызовом LEN (ЛСТ), где LST = [1], так как Кажется, python считает, что это переменная None? Я совершенно смущен.

На консольном терминале для python я могу ввести len ([1]), и я получаю результат 1 без каких-либо проблем. Также имейте в виду, я полностью осознаю, что это не лучший способ сделать то, что я пытаюсь сделать, но я только начинаю изучать питон!

Любые идеи?

+1

Вам не приходилось проверять значение 'lst'?!? –

+0

Что вы имеете в виду? Я предполагал, что вход всегда будет списком целых чисел, если это то, о чем вы говорите? – tdeoliveira05

+0

Вы меняете 'lst' в начале функции; вы не проверили, чтобы посмотреть, к чему это изменилось? –

ответ

8

lst.sort() сортирует список на месте и возвращает None. Так lst = lst.sort() комплектов lst до None.

Я думаю, что лучше исправить это сделать

lst = sorted(lst) 

Это не меняет список на месте, так что переменные, относящиеся к тому же списку вне этой функции остаются неизменными.

+0

oh wow ok - не знал. Благодаря! – tdeoliveira05

+0

из любопытства: есть ли причина, по которой вы предпочитаете 'lst = sorted (lst)' to 'lst.sort()'? (я не согласен здесь! + 1'd так или иначе!) –

+0

'.sort()' был создан для возврата 'None', чтобы напомнить программисту, что он сортируется на месте. Разве это не иронично? – VPfB

0

Ваше название ошибочно. list.sort() возвращает None, потому что он действует по побочному эффекту; первая строка отбросила список.

0

Вместо использования lst.sort(), который возвращает None, вы можете использовать sorted() встроенные функции, как показано ниже:

lst = sorted(lst) 

Теперь lst содержит ваш отсортированный список.