从字符串列表中获取最长持续时间

Raf*_*bir 8 python python-3.x

我有一个像下面这样的持续时间列表

['5d', '20h', '1h', '7m', '14d', '1m']
Run Code Online (Sandbox Code Playgroud)

其中d代表天,h代表小时,m代表分钟。

我想从这个列表中获得最长的持续时间(14d在这种情况下)。我怎样才能从这个字符串列表中得到它?

Nic*_*ais 15

np.argmaxpd.to_timedelta

import numpy as np
import pandas as pd

durations = ['5d', '20h', '1h', '7m', '14d', '1m']

durations[np.argmax(pd.to_timedelta(durations))]
Run Code Online (Sandbox Code Playgroud)
Out[24]: '14d'
Run Code Online (Sandbox Code Playgroud)

pd.to_timedelta将字符串转换为持续时间 ( source ),并np.argmax返回最高元素的索引。


Fil*_*ski 12

纯python解决方案。我们可以存储我们的时间扩展 ( m, h, d) 和分钟 (here time_map)之间的映射,以找到最长的持续时间。这里我们使用max()withkey参数来应用我们的映射。

inp = ['5d', '20h', '1h', '7m', '14d', '1m']
time_map = {'m': 1, 'h': 60, 'd': 24*60}

print(max(inp, key=lambda x:int(x[:-1])*time_map[x[-1]]))  # -> 14d
Run Code Online (Sandbox Code Playgroud)


kay*_*ya3 5

这是一个绝对的技巧,它以一种糟糕但聪明的方式解决了这个问题:Pythonminmax函数可以与key用于比较元素的函数一起使用,以便它返回最小化或最大化该函数的元素。如果key函数返回一个元组,那么顺序由元组的第一个组件决定,使用第二个组件作为决胜局。

我们可以利用最后一个字符'd','h''m'可以按字母顺序进行比较的事实;一d AY长于一个ħ我们的比长inute。这意味着最长的持续时间具有按字母顺序排列的最小字符,最大整数作为决胜局。最大化该整数与最小化其否定相同:

>>> durations = ['5d', '20h', '1h', '7m', '14d', '1m']
>>> min(durations, key=lambda d: (d[-1], -int(d[:-1])))
'14d'
Run Code Online (Sandbox Code Playgroud)