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.

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top