2017-01-06 9 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]) 

は、上記の私のコードであり、それは私に次のエラーを与え続けて:それは私がlen(LST)を呼び出すと、問題を持っているかのように

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

に思えるどこLST = [1]理由Pythonはそれが変数ではないと思うようですか?私はかなり混乱しています。

私はlen([1])とタイプすることができますが、私は問題なく1の結果を得ます。また、これは私がやろうとしていることを行うための最良の方法ではないことを完全に認識していることを覚えておいてください。しかし、私はちょうどPythonを学び始めています!

アイデア?

+1

実際に 'lst'の値を確認することはありませんでしたか? –

+0

どういう意味ですか?私はあなたが何を参照している場合は、入力が常に整数のリストになると仮定していた? – tdeoliveira05

+0

'lst'は、関数の先頭で変更します。あなたは何が変わったのか確認するためにチェックしなかったのですか? –

答えて

8

lst.sort()は、リストをインプレースでソートし、Noneを返します。したがってlst = lst.sort()lstNoneと設定します。

私は最善の修正プログラムは、この関数の外で同じリストを参照する変数が変更されないように、これは、インプレースリストを変更しない

lst = sorted(lst) 

行うことだと思います。

+0

ああwow ok - 知らなかった。ありがとう! – tdeoliveira05

+0

:好奇心を失って: 'lst = sorted(lst)'から 'lst.sort()'を好む理由はありますか? –

+0

'.sort()'は、 'None'を返すように設計されていて、プログラマにインプレースのソートを思い出させます。それは皮肉ではないですか? – VPfB

0

あなたのタイトルは間違っています。 list.sort()は、副作用によって動作するため、Noneを返します。最初の行はリストを破棄しました。代わりにNoneを返すlst.sort()を使用しての

0

、あなたは以下のようにsorted()組み込み関数を使用することができます。

lst = sorted(lst) 

lstはあなたのソートされたリストが含まれています。

関連する問題