Filtre Python / combo max - vérification de iterator vide
-
30-09-2019 - |
Question
(avec Python 3.1)
Je sais que cette question a été posée à plusieurs reprises la question générale des tests si iterator est vide; De toute évidence, il n'y a pas de solution propre à ce (je suppose que pour une raison - un itérateur ne sait pas vraiment si elle est vide jusqu'à ce qu'il soit demandé de retourner sa valeur suivante).
J'ai un exemple spécifique, cependant, et espérais que je peux faire un code propre et Pythonic sortir:
#lst is an arbitrary iterable
#f must return the smallest non-zero element, or return None if empty
def f(lst):
flt = filter(lambda x : x is not None and x != 0, lst)
if # somehow check that flt is empty
return None
return min(flt)
Y at-il une meilleure façon de le faire?
EDIT: désolé pour la notation stupide. Le paramètre de la fonction est en effet un itérables arbitraire, au lieu d'une liste.
La solution
def f(lst):
flt = filter(lambda x : x is not None and x != 0, lst)
try:
return min(flt)
except ValueError:
return None
min
jette ValueError
lorsque la séquence est vide. Cela fait suite à la commune « plus facile de demander pardon » paradigme.
EDIT: Une solution de réduire, sans exceptions
from functools import reduce
def f(lst):
flt = filter(lambda x : x is not None and x != 0, lst)
m = next(flt, None)
if m is None:
return None
return reduce(min, flt, m)
Autres conseils
def f(lst):
# if you want the exact same filtering as the original, you could use
# lst = [item for item in lst if (item is not None and item != 0)]
lst = [item for item in lst if item]
if lst: return min(lst)
else: return None
la compréhension de la liste ne permet que des éléments qui n'évaluent pas à false booléen (qui filtre 0 et None)
une liste vide à savoir [] évaluera la valeur False, donc « si LST: » ne sera déclenchée que si la liste contient des éléments
vous pouvez aller pour réduire l'expression trop return reduce(lambda a,b: a<b and a or b,x) or None