predicciones - Python: min(Ninguno, x)
predicciones python (8)
¿Por qué no creas un generador sin ningún valor? Es más sencillo y limpio.
>>> l=[None ,3]
>>> min(i for i in l if i is not None)
3
Me gustaría realizar lo siguiente:
a=max(a,3)
b=min(b,3)
Sin embargo, a veces a
y b
pueden ser None
.
Me alegró descubrir que, en el caso de max
, funciona bien, dando el resultado requerido 3
, sin embargo, si b
es None
, b
sigue siendo None
...
¿Alguien puede pensar en un pequeño y elegante truco para hacer que min
devuelva el número en caso de que uno de los argumentos en Ninguno?
Aquí hay un decorador en línea que puede utilizar para filtrar los valores de Ninguno que podrían pasarse a una función:
noNones = lambda fn : lambda *args : fn(a for a in args if a is not None)
print noNones(min)(None, 3)
print noNones(max)(None, 3)
huellas dactilares:
3
3
La respuesta de @utdemir funciona muy bien para el ejemplo proporcionado, pero generaría un error en algunos escenarios.
Un problema que surge es si tiene una lista con solo valores None
. Si proporciona una secuencia vacía a min()
, generará un error:
>>> mylist = [None, None]
>>> min(value for value in mylist if value)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: min() arg is an empty sequence
Como tal, este fragmento evitaría el error:
def find_minimum(minimums):
potential_mins = (value for value in minimums if value is not None)
if potential_mins:
return min(potential_mins)
Mi solución para Python 3 (3.4 y mayor):
min((x for x in lst if x is not None), default=None)
max((x for x in lst if x is not None), default=None)
Puede usar un inline if
y un infinito como predeterminado, ya que funcionará para cualquier valor:
a = max(a if a is not None else float(''-inf''), 3)
b = min(b if b is not None else float(''inf''), 3)
Una solución para el Python 3.
Código :
# variable lst es tu secuencia
min(filter(lambda x: x is not None, lst)) if any(lst) else None
Ejemplos:
In [3]: lst = [None, 1, None]
In [4]: min(filter(lambda x: x is not None, lst)) if any(lst) else None
Out[4]: 1
In [5]: lst = [-4, None, 11]
In [6]: min(filter(lambda x: x is not None, lst)) if any(lst) else None
Out[6]: -4
In [7]: lst = [0, 7, -79]
In [8]: min(filter(lambda x: x is not None, lst)) if any(lst) else None
Out[8]: -79
In [9]: lst = [None, None, None]
In [10]: min(filter(lambda x: x is not None, lst)) if any(lst) else None
In [11]: print(min(filter(lambda x: x is not None, lst)) if any(lst) else None)
None
Notas:
Trabajados en secuencia se presentan como números y como ninguno. Si todos los valores son Ninguno, min () genera una excepción.
ValueError: min () arg es una secuencia vacía
Este código resuelve este problema en absoluto
Pros:
- Trabajó si ninguno se presenta en secuencia
- Trabajado en Python 3
- max () sera trabajo tambien
Contras
- Necesita más de una variable distinta de cero en la lista. es decir, [0, Ninguno] falla.
- Necesita una variable (ejemplo lst ) o necesita duplicar la secuencia
def max_none(a, b):
if a is None:
a = float(''-inf'')
if b is None:
b = float(''-inf'')
return max(a, b)
def min_none(a, b):
if a is None:
a = float(''inf'')
if b is None:
b = float(''inf'')
return min(a, b)
max_none(None, 3)
max_none(3, None)
min_none(None, 3)
min_none(3, None)
a=max(a,3) if a is not None else 3
b=min(b,3) if b is not None else 3