2017-03-04 10 views
5

Sadece birkaç gün geri python 3 ile başladı. programlama, garip bir durumPython değiştirilemez türler: YokTüm()> int() bir listenin maksimumunu bulurken

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

max(a) geldi bana

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

verir Ama

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

max(a) görüntüler denerseniz

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

Bu davranış için herhangi bir sebep var mı?

Güncelleme 1: Ben farklı bir şey ile çalıştı

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

ve max(a) hata bu durumda neden gösterilmediğini [5, [[5, 6], [7, 8]]] Benim şüphe nedir?

+1

Hangi kısım karıştı? Listelerin ilk öğeleri eşit değilse, ikinci elemanla kopmaya gerek yoktur. – jonrsharpe

+0

Reddetmenin herhangi bir nedeni var mı? –

+0

@jonrsharpe: tamam .. şüpheliyim python bana hatayı gösteriyor? için '' [[5, [[1,2], [3,4]]], [5, [[3,4], [5,6]]], [5, [[5,6 ], [7,8]]]] '' '' '' '' '' '' '[5, [[5, 6], [7, 8]]]' '' ile aynı hata neden gösterilmiyor? –

cevap

6

o Yok değerlerini karşılaştığında max yapar da ondan:

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

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

Temelde maksimum liste yineleme ve daha büyük değerini bulmaya çalışıyor:

max([1, None]) 

aynı hatayı veriyor ilk. Ancak Yok'a ulaştığında, artık bu kadar fazla hatayla karşılaştıramaz.

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

bu 5 ve 5.1 karşılaştırır ve daha büyük olarak 5.1 ile listesi yer almaktadır ile

.

Her iki ilk değer 5 iken, bir sonraki öğeyi yinelemeye ve hataya neden olan None'a gitti.

Güncelleme:

daha iyi hata mesajı netleştirmeye yardımcı olabilir Bu örnek:

max([1,'2']) 

hatası:

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

temelde '2' with 1 karşılaştırmaya çalıştık ve TypeError: unorderable types: str() > int()

verdi daha önce birlikteydik Elimizdeki mparing None with int() 1 ve hata iletisi Python 2'de TypeError: unorderable types: NoneType() > int()

+0

Şüphe duyduğunuz için teşekkür ederiz. –

+0

@curious_coder hoşgeldiniz :) –

3

, size tahmin edemedi bir minimum değeri gerektiğinde tamsayı yok gibi herhangi bir tam sayıya düşük (bazı durumlarda yararlı karşılaştırıldığında bu None hile olduğunu C) 'de olduğu gibi sabit bir min/maks.

Python 3 bu artık mümkün değildir (ve örneğin "2" ve 3 gibi tamsayılar için dizeleri karşılaştırırken en iyisi bu çoğu zaman, bu büyük bir dertten kurtarır.

Eğer gerçekten gerekiyorsa Ben geçici bir çözüm düşünülebilir ki

başka bir nesne daha düşük bir sınıf tanımlayabilirsiniz ve None yerine bu sınıfın bir örneğini kullanın:.

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

alıyorum:

Tiebreak'in çalıştığını kanıtlayan

.

Bunun en az bir uygulama olduğunu unutmayın. max sadece> kullanır: sadece __gt__ tanımlamak tembel, biz genel kullanım için __ge__, __le__, __lt__ tanımlamak gerekir.

İlgili konular