Eu tenho uma lista de durações como abaixo
['5d', '20h', '1h', '7m', '14d', '1m']
onde d
fica por dias, h
fica por horas e m
fica por minutos.
Eu quero obter a maior duração desta lista ( 14d
neste caso). Como posso obter isso dessa lista de strings?
python
python-3.x
Rafiul Sabbir
fonte
fonte
Respostas:
Solução python pura. Poderíamos armazenar mapeamento entre nossas extensões de tempo (
m
,h
,d
) e minutos (aquitime_map
), para encontrar maior duração. Aqui estamos usandomax()
comkey
argumento para aplicar o nosso mapeamento.fonte
np.argmax
empd.to_timedelta
:pd.to_timedelta
transforma uma string em uma duração ( origem ) enp.argmax
retorna o índice do elemento mais alto.fonte
Aqui está um truque absoluto que resolve o problema de uma maneira ruim, mas inteligente: o Python
min
e asmax
funções podem ser usadas com umakey
função usada para comparar elementos, para que ele retorne o elemento, minimizando ou maximizando essa função. Se akey
função retornar uma tupla, a ordem será determinada pelo primeiro componente da tupla, usando o segundo componente como desempatador.Podemos explorar o fato de que o último caracteres
'd'
,'h'
e'm'
pode ser comparado em ordem alfabética; um d ay é mais longo do que um h a é mais do que um m inute. Isso significa que a duração mais longa tem o caractere mínimo em ordem alfabética, com o número inteiro máximo como desempate. Maximizar esse número inteiro é o mesmo que minimizar sua negação:fonte
s
, e semanas comoW
e meses comoM
, e ainda funcionaria; o hack quebra se você incluir anos como umy
ou outroY
. Também depende de não haver durações, como10000000m
onde uma unidade maior poderia ser usada; Estou assumindo que as strings são a saída de alguma API que sempre usa a maior unidade possível.Resultado:
Útil para esse conjunto específico de strings, mas se o formato for diferente, será necessário ajustar o primeiro elemento da tupla de acordo. Agora faz sentido porque
s
>m
>h
>d
.fonte
aqui está uma solução com expressão regular
fonte
Desde que seus horários sejam bem-formados, você poderá encontrar o com
max
base em uma única expressão regular:A expressão regular cria uma tupla de dias, horas, minutos como seqüências de caracteres. O
tuple(map(int, ...))
converte em números inteiros.max
escolhe a maior dessas tuplas, que naturalmente pesam dias mais fortes que as horas que duram que os minutos.fonte
Uma maneira possível:
Resultado
fonte