Tengo una lista de duraciones como a continuación
['5d', '20h', '1h', '7m', '14d', '1m']
donde d
está parado por días, h
está parado por horas y m
está parado por minutos.
Quiero obtener la mayor duración de esta lista ( 14d
en 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()
conkey
argumento para aplicar nuestro mapeo.fuente
np.argmax
enpd.to_timedelta
:pd.to_timedelta
convierte una cadena en una duración ( fuente ) ynp.argmax
devuelve el índice del elemento más alto.fuente
Aquí hay un truco absoluto que resuelve el problema de una manera mala pero inteligente: Python
min
y lasmax
funciones se pueden usar con unakey
función que se usa para comparar elementos, de modo que devuelva el elemento minimizando o maximizando esa función. Si lakey
funció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 comoW
y meses comoM
, y todavía funcionaría; Sin embargo, el truco se rompe si incluye años comoy
oY
. También se basa en que no haya duraciones como10000000m
donde 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
max
basados 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.max
elige 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