Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

131
Vistas
¿Cómo agregar un paso intermedio adicional en la comprensión de una lista?

Digamos que tengo un typing.List[str] que contiene marcas de tiempo en formato "HH:mm" , por ejemplo

 timestamps = ["22:58", "03:11", "12:21"]

Quiero convertirlo en un typing.List[int] con los valores de "número de minutos desde la medianoche" para cada marca de tiempo:

 converted = [22*60+58, 3*60+11, 12*60+21]

... pero quiero hacerlo con estilo y usar una sola lista de comprensión para hacerlo. Una implementación (sintácticamente incorrecta) que construí ingenuamente fue algo así como:

 def timestamps_to_minutes(timestamps: typing.List[str]) -> typing.List[int]: return [int(hh) * 60 + int(mm) for ts in timestamps for hh, mm = ts.split(":")]

... pero esto no funciona porque for hh, mm = ts.split(":") no es una sintaxis válida.

¿Cuál sería la forma válida de escribir lo mismo?

Para aclarar: puedo ver una solución formalmente satisfactoria en la forma de:

 def timestamps_to_minutes(timestamps: typing.List[str]) -> typing.List[int]: return [int(ts.split(":")[0]) * 60 + int(ts.split(":")[1]) for ts in timestamps]

... pero esto es muy ineficiente y no quiero dividir la cadena dos veces.

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Podría usar una expresión generadora interna para hacer la división:

 [int(hh)*60 + int(mm) for hh, mm in (ts.split(':') for ts in timestamps)]

Aunque personalmente, prefiero usar una función de ayuda en su lugar:

 def timestamp_to_minutes(timestamp: str) -> int: hh, mm = timestamp.split(":") return int(hh)*60 + int(mm) [timestamp_to_minutes(ts) for ts in timestamps] # Alternative list(map(timestamp_to_minutes, timestamps))
over 4 years ago · Santiago Trujillo Denunciar

0

Si no desea dividir la cadena dos veces, puede usar := operador de asignación:

 timestamps = [int((s := t.split(":"))[0]) * 60 + int(s[1]) for t in timestamps] print(timestamps)

Huellas dactilares:

 [1378, 191, 741]

Alternativa:

 print([int(h) * 60 + int(m) for h, m in (t.split(":") for t in timestamps)])

Huellas dactilares:

 [1378, 191, 741]

Nota: := es una característica de Python 3.8+ comúnmente conocida como el " operador morsa ". Aquí el PEP con la propuesta.

over 4 years ago · Santiago Trujillo Denunciar

0

Tu pseudocódigo inicial

 [int(hh) * 60 + int(mm) for ts in timestamps for hh, mm = ts.split(":")]

está bastante cerca de lo que puedes hacer:

 [int(hh) * 60 + int(mm) for ts in timestamps for hh, mm in [ts.split(':')]]

En Python 3.9, expresiones como esta se optimizaron para que crear una matriz de un solo elemento dentro de una comprensión solo para acceder a su único elemento de inmediato sea tan rápido como una simple asignación.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda