Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

139
Visualizações
¿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 Respostas
Responde à pergunta

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 Relatório

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda