es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Devolver todas las posibles combinaciones de dos listas.

He intentado devolver todas las combinaciones posibles de dos listas dadas utilizando una clase. La combinación deberá consistir en un elemento de cada lista. Puedo hacerlo hasta que la longitud de la segunda lista sea 1. Pero después de aumentar la longitud, no obtengo la salida esperada.

Como ejemplo, el código es:

class IceCreamMachine:

    def __init__(self, ingredients, toppings):
        self.ingredients = ingredients
        self.toppings = toppings

    def scoops(self):
        IceCreamList = []
        for i in range(len(self.ingredients)):
            IceCreamList.append([self.ingredients[i], self.toppings[i%len(self.toppings)]])

        return IceCreamList

machine = IceCreamMachine(['vanilla', 'chocolate'], ['chocolate sauce'])

print(machine.scoops())

Devuelve la salida esperada que es [[‘vanilla’, ‘chocolate sauce’], [‘chocolate’, ‘chocolate sauce’]], pero cada vez que intento aumentar el elemento de la segunda lista, muestra una respuesta incorrecta.
¿Alguien puede sugerirme cómo resolver el problema?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Basado en el código proporcionado, parece que el problema es que la función scoops() está diseñada para manejar únicamente casos donde la lista toppings tiene una longitud de 1 o menos. Para manejar casos donde la lista toppings tiene una longitud mayor a 1, necesitas modificar el código para generar todas las posibles combinaciones de ingredientes y toppings, en lugar de repetir el mismo topping una y otra vez.

    Una forma de lograr esto es utilizando la función itertools.product(), la cual genera el producto cartesiano de dos o más iterables de entrada:

    import itertools
    
    class IceCreamMachine:
    
        def __init__(self, ingredients, toppings):
            self.ingredients = ingredients
            self.toppings = toppings
    
        def scoops(self):
            return list(itertools.product(self.ingredients, self.toppings))
    
    machine = IceCreamMachine(["vanilla", "chocolate"], ["chocolate sauce", "nuts"])
    print(machine.scoops())
    

    Salida:

    [('vanilla', 'chocolate sauce'), ('vanilla', 'nuts'), ('chocolate', 'chocolate sauce'), ('chocolate', 'nuts')]
    

    Al utilizar itertools.product(), podemos generar todas las posibles combinaciones de ingredientes y toppings, sin tener que preocuparnos por crear manualmente un bucle sobre la longitud de la lista de ingredientes y verificar para obtener el topping correcto.

Comments are closed.