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.

¿Hay una manera de agregar elementos a una lista en un bucle for sin inicializar la lista antes del bucle for?

Estoy intentando ordenar una clase con múltiples atributos y poner cada uno de ellos en una lista. Esto se está utilizando en una prueba de unidad para confirmar que mi clase los está ordenando correctamente. ¿Hay alguna manera de crear una lista y agregar cosas a ella en una línea (como en la comprensión de listas) dentro de un bucle for?

Por ejemplo, para ordenarlos ahora, tengo que usar algo como esto:
los objetos son una lista de objetos de clase Objeto

red_objects = []
blue_objects = []
green_objects = []
para objeto en objetos:
si objeto.color == “rojo”:
red_objects.append(objeto.nombre)
elif objeto.color == “azul”:
blue_objects.append(objeto.nombre)
elif objeto.color == “verde”:
green_objects.append(objeto.nombre)

o algo así:
red_objects = [objeto.nombre para objeto en objetos si objeto.color == “rojo”]
blue_objects = [objeto.nombre para objeto en objetos si objeto.color == “azul”]
green_objects = [objeto.nombre para objeto en objetos si objeto.color == “verde”]

Obviamente, la segunda opción es mucho más limpia, sin embargo, tengo que recorrer el bucle tres veces por separado. ¿Existe alguna forma de combinar los dos métodos para que pueda recorrer el bucle solo una vez, pero puedo crear las listas de manera similar a la comprensión de listas?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, puedes utilizar la comprensión de diccionarios para lograr esto. Puedes crear un diccionario con la clave como el color y el valor como una lista de nombres, y luego convertir ese diccionario en listas separadas si es necesario. Aquí hay un ejemplo:

    objects = [...] # lista de elementos de la clase Object
    
    objects_by_color = {color: [] for color in ['rojo', 'azul', 'verde']} # crear listas vacías para cada color
    
    for object in objects:
        objects_by_color[object.color].append(object.name) # agregar nombre del objeto a la lista de color correspondiente
    
    objetos_rojos = objects_by_color['rojo']
    objetos_azules = objects_by_color['azul']
    objetos_verdes = objects_by_color['verde']
    

    De esta manera, solo iteras a través del bucle una vez y creas las listas de manera similar a la comprensión de listas.

Comments are closed.