2010-02-19 5 views
16

Y at-il une fonction intégrée intelligente ou quelque chose qui renverra 1 pour l'exemple min() ci-dessous? (Je parie qu'il ya une raison solide pour qu'il ne retourne rien, mais dans mon cas particulier, je dois à ne pas tenir compte None valeurs vraiment mauvais!)Liste minimum en Python avec None?

>>> max([None, 1,2]) 
2 
>>> min([None, 1,2]) 
>>> 

Répondre

33

None est retourné

>>> print min([None, 1,2]) 
None 
>>> None < 1 
True 

Si vous voulez revenir 1 vous devez filtrer loin le None:

>>> L = [None, 1, 2] 
>>> min(x for x in L if x is not None) 
1 
+1

Notez que 'none' n'est retourné en Python 2. En Python 3,' min ([Aucun, 1, 2]) 'donne un 'TypeError: '<' non pris en charge entre les instances de 'int' et 'NoneType''. –

3

utilisant une expression du générateur:

>>> min(value for value in [None,1,2] if value is not None) 
1 

éventuellement, vous pouvez utiliser le filtre:

>>> min(filter(lambda x: x is not None, [None,1,2])) 
1 
+1

il est préférable de comparer l'identité, puis l'égalité lorsqu'il s'agit de «Aucun» – SilentGhost

+0

vous avez raison, corrigé. –

+2

La syntaxe n'a rien de python 3. Cela fonctionne très bien dans python 2. L'utilisation de 'is' pour comparer avec' None' comme dans 'value is not None' est préférable à' == '(ou'! = '). La ligne avec 'filter' est ** mauvaise **, essayez de mettre un 0 dans la liste et vous verrez qu'elle sera filtrée aussi, ce qui n'est pas ce que vous voulez. – nosklo