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.

Comprensión de lista sobre un objeto mapa que accede a una propiedad

Tengo la siguiente comprensión de lista:
 
preprocesador_video = preprocess(video)
timestamps = [frame.timestamp for frame in preprocessed_video]

La colección siempre está vacía, aunque haya marcos con su valor de marca de tiempo correspondiente inicializado. El video es un objeto de mapa, que consiste en una colección de marcos, proveniente de otra función de preprocesamiento, y un marco es una clase con una propiedad de marca de tiempo:

def preprocess(video):
return map(fun, video) # fun devuelve un Frame

clase Frame ():
def init (… timestamp):
self.timestamp = marca de tiempo

@property
def timestamp():
return self.timestamp

Si en preprocess(video) devuelvo una lista como list(map(fun, video)), la comprensión de lista timestamp tiene valores. Sin embargo, si solo devuelvo un mapa, obtengo una lista vacía. ¿Por qué está sucediendo esto?

Tags:  ,

Answer

  1. Avatar for davy.ai

    El problema es causado por retornar un objeto map en lugar de una lista después de preprocesar el video. map es un iterador de carga perezosa, lo que significa que actúa como un generador que solo genera los valores según sea necesario, y puede comportarse de manera diferente a una lista en ciertas situaciones.

    En el código dado, cuando la comprensión intenta extraer la propiedad timestamp de cada frame, no está generando los valores del objeto map. Cuando se convierte el valor devuelto de preprocess(video) a una lista usando la función list(), el objeto map genera los valores y, por lo tanto, la comprensión tiene valores para timestamps.

    Para solucionar este problema, podemos modificar la función preprocess para que devuelva una lista en lugar de un objeto map o convertir el objeto map a una lista antes de usar la comprensión. Una posible modificación a la función preprocess podría ser:

    def preprocess(video):
        return [fun(frame) for frame in video] # fun devuelve un Frame
    

    Esto asegurará que la función devuelva una lista que se utilizará para inicializar la variable preprocessed_video, y la comprensión posterior generará la lista de timestamps deseada.

Comments are closed.