Tengo una lista de duraciones como a continuación
['5d', '20h', '1h', '7m', '14d', '1m']
donde destá parado por días, hestá parado por horas y mestá parado por minutos.
Quiero obtener la mayor duración de esta lista ( 14den este caso). ¿Cómo puedo obtener eso de esta lista de cadenas?
python
python-3.x
Rafiul Sabbir
fuente
fuente

Respuestas:
Solución de pitón puro. Podíamos guardar correspondencia entre nuestras extensiones de tiempo (
m,h,d) y minutos (aquítime_map), para encontrar mayor duración. Aquí estamos utilizandomax()conkeyargumento para aplicar nuestro mapeo.fuente
np.argmaxenpd.to_timedelta:pd.to_timedeltaconvierte una cadena en una duración ( fuente ) ynp.argmaxdevuelve el índice del elemento más alto.fuente
Aquí hay un truco absoluto que resuelve el problema de una manera mala pero inteligente: Python
miny lasmaxfunciones se pueden usar con unakeyfunción que se usa para comparar elementos, de modo que devuelva el elemento minimizando o maximizando esa función. Si lakeyfunción devuelve una tupla, el primer componente de la tupla determina el orden, utilizando el segundo componente como un desempate.Podemos explotar el hecho de que los últimos caracteres
'd','h'y'm'se pueden comparar en orden alfabético; un d ay es más largo que una hora nuestra es más largo que un m inute. Esto significa que la duración más larga tiene el carácter mínimo en orden alfabético, con el número entero máximo como un desempate. Maximizar ese entero es lo mismo que minimizar su negación:fuente
s, y semanas comoWy meses comoM, y todavía funcionaría; Sin embargo, el truco se rompe si incluye años comoyoY. También se basa en que no haya duraciones como10000000mdonde podría usarse una unidad más grande; Supongo que las cadenas son el resultado de alguna API que siempre usa la unidad más grande posible.Salida:
Útil para este conjunto particular de cadenas, pero si el formato difiere, deberá ajustar el primer elemento de la tupla en consecuencia. En este momento tiene sentido porque
s>m>h>d.fuente
aquí hay una solución con expresión regular
fuente
Siempre que sus tiempos estén bien formados, puede encontrarlos
maxbasados en una sola expresión regular:La expresión regular crea una tupla de días, horas, minutos como cadenas. El lo
tuple(map(int, ...))convierte a enteros.maxelige la más grande de estas tuplas, que naturalmente pesan días más fuertes que las horas más largas que los minutos.fuente
Una forma posible:
Salida
fuente