Estoy tratando de obtener el número impar mínimo usando python. Utilicé lambda, bucles y otros métodos para obtener un número impar mínimo, pero no pude obtener eso usando funciones. aqui esta mi codigo

z= [1,8,-4,-9]

def min_odd(x):
    for i in x:
        if (i%2!=0):
    return min(i)

y = min_odd(z)
print (y)

¿Puede alguien decirme qué me faltaba aquí?

1
rotwar 15 sep. 2018 a las 23:14

5 respuestas

La mejor respuesta

La función min() espera un iterable como una lista de la que luego obtendrá el elemento más pequeño.

P.ej. min([1,0,3]) da 0.

Entonces, si desea usarlo, debe crear una lista (u otro iterable) de los números impares que luego puede pasarle:

def min_odd(x):
    odds = []
    for i in x:
        if i % 2 != 0:
            odds.append(i)
    return min(odds)

Tenga en cuenta que también podríamos usar una lista de comprensión:

def min_odd(x):
    return min([i for i in x if i % 2 != 0])

Que ambos funcionan.


Un método alternativo sería almacenar el valor impar mínimo actual en una variable y actualizar esta variable si encontramos un valor impar más pequeño:

def min_odd(x):
   min_v = float('inf')
   for i in x:
      if i % 2 != 0 and i < min_v:
         min_v = i
   return min_v
4
Joe Iddon 15 sep. 2018 a las 20:19

Parece que la lógica de tu código es incorrecta. En primer lugar, parece tener un error de sangría en la declaración de devolución. En segundo lugar, la función min () requiere una colección de elementos (como una matriz, por ejemplo) o una serie de argumentos para determinar el mínimo en esa serie. Puedes probar varias cosas.

  1. Use otra variable para almacenar un mínimo temporal. Reemplácelo cada vez que encuentre un valor impar menor (para cada i en x ... si el valor es impar y es menor que el valor impar anterior, reemplácelo) y comience con el primer número impar que pueda encontrar.

  2. Tome todos los números impares y agréguelos a otra matriz en la que aplicará la función min.

Espero que esto sea útil!

3
vladvlad23 15 sep. 2018 a las 20:26

min opera en un iterable. i no es iterable en su código; Es el último elemento de la lista.

Sin embargo, puede lograr lo que desea con un filtro:

min(filter(lambda e: e%2 != 0, x))
1
erip 15 sep. 2018 a las 20:19

Puede pasar un generador a la función min():

def min_odd(iterable):
    return min(i for i in iterable if i % 2)

No escribí i % 2 != 0 porque cualquier número impar devolverá 1 que tiene un valor booleano de True.

Agregué un parámetro a la función que toma el iterable para que pueda usarse para cualquier iterable pasado.

2
N Chauhan 15 sep. 2018 a las 20:20

Tratar:

min([val for val in z if val % 2 != 0])

3
msi_gerva 15 sep. 2018 a las 20:20