2017-03-04 18 views
5

私は数日前にpythonを使い始めました。プログラミングの間、私は奇妙な状況Pythonの順序付け不可能な型:リストの最大値を見つけるときのNoneType()> int()

a = [ 
    [5, [[1, 1, None], [None, None, None], [None, None, None]]], 
    [5, [[1, None, 1], [None, None, None], [None, None, None]]] 
    ] 

max(a)に出くわした私に

Traceback (most recent call last): File "", line 1, in TypeError: unorderable types: NoneType() > int()

を与えるしかし、私は

a = [ 
    [5, [[1, 1, None], [None, None, None], [None, None, None]]], 
    [5.1, [[1, None, 1], [None, None, None], [None, None, None]]] 
    ] 

max(a)ディスプレイをしようとした場合

[5.1, [[1, None, 1], [None, None, None], [None, None, None]]] 

この現象の特別な理由は何ですか?

更新1: は、私は別の何かをしようとした

a = [[5, [[1,2], [3,4]]],[5,[[3,4],[5,10]]],[5,[[5,6],[7,8]]]] 

max(a)エラーが、この場合には表示されない原因を[5, [[5, 6], [7, 8]]] 私の疑問があるのですか?

+1

どの部分を混乱させていますか?リストの最初の要素が等しくない場合、2番目の要素とブレークを結ぶ必要はありません。 – jonrsharpe

+0

ダウンボートの特別な理由は何ですか? –

+0

@jonrsharpe:大丈夫です。私の疑問はなぜpythonが私にエラーを示しているのですか? [5、[[1,2]、[3,4]]、[5、[[3,4]、[5,6]]]、[5、[[5,6] ]、[[7,8]]]] '' '出力は' '' [5、[[5,6]、[7,8]]] '' 'で、なぜ同じエラーが表示されないのですか? –

答えて

6

それはなし値に遭遇したときmaxがこれを行うためです:

max([1, None]) 

も同じエラーを与える:

--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-14-c33cf47436bc> in <module>() 
----> 1 max([1,None]) 

TypeError: unorderable types: NoneType() > int() 

は、基本的には、最大では、リストを反復処理すると、より大きな価値を見つけるためにしようとしています最初。しかし、それがNoneに達すると、これ以上比較できないので、エラーをスローします。

a = [ 
    [5, [[1, 1, None], [None, None, None], [None, None, None]]], 
    [5.1, [[1, None, 1], [None, None, None], [None, None, None]]] 
    ] 

それは5と5.1を比較し、より大きな5.1でリストを検討します。

最初の値が両方とも5だった場合、次の項目を繰り返し実行して、エラーの原因となったNoneに突き当たりました。

更新:

より良いエラーメッセージを明確に役立つかもしれない。この例:

max([1,'2']) 

エラー:

TypeError: unorderable types: str() > int() 

は、基本的には'2' with 1を比較しようとしたとTypeError: unorderable types: str() > int()

を与えました私たちは以前None with int() 1をmparing、あなたは整数が持っていないとして、あなたは(予測できなかった最小値を必要なときに我々が得たエラーメッセージは、Python 2ではTypeError: unorderable types: NoneType() > int()

+0

疑いを晴れてくれてありがとう。 –

+0

@curious_coderあなたは大歓迎です:) –

3

た、任意の整数に低く比べ、このNoneトリックは、いくつかのケースで有用でしたCのように固定された最小/最大)。

のPython 3ではこれはもはや不可能である(そして例えば"2"および3のように整数に文字列を比較するとき、それは最善のためだ時間のほとんどは、それが頭痛の多くを保存します。

あなたが本当に必要な場合それは、私が回避策を考え

あなたが他のオブジェクトよりも低くなっているクラスを定義し、代わりにNoneのそのクラスのインスタンスを使用することができます。

class AM: 
    def __int__(self): 
     return 0 
    def __gt__(self,other): 
     return False 
    def __repr__(self): 
     return "INF" # prints out nicely 

always_min = AM() 

a = [ 
    [5, [[1, 1, always_min], [always_min, always_min, always_min]]], 
    [5, [[1, always_min, 1], [always_min, always_min, always_min]]] 
    ] 

print(max(a)) 

私が手:

[5, [[1, 1, INF], [INF, INF, INF]]] 

これは、タイブレークが機能することを証明する。

これは最小限の実装であることに注意してください。 maxのみを使用する:>:__gt__のみを定義するのは怠惰なので、一般的な使用方法として、他のものを定義する必要があります。__ge____le____lt__

関連する問題