以下のような期間のリストがあります
['5d', '20h', '1h', '7m', '14d', '1m']
ここでd、日をh表し、時間をm表し、分を表します。
このリスト(14dこの場合)から最長の期間を取得したい。この文字列のリストからどうすれば取得できますか?
以下のような期間のリストがあります
['5d', '20h', '1h', '7m', '14d', '1m']
ここでd、日をh表し、時間をm表し、分を表します。
このリスト(14dこの場合)から最長の期間を取得したい。この文字列のリストからどうすれば取得できますか?
回答:
純粋なpythonソリューション。私たちは、時間延長(間のマッピングを格納することができm、h、d)と分(ここではtime_map最高の時間を見つけるために、)。ここでは、マッピングを適用するためにmax()with key引数を使用しています。
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
np.argmaxにpd.to_timedelta:
import numpy as np
import pandas as pd
durations = ['5d', '20h', '1h', '7m', '14d', '1m']
durations[np.argmax(pd.to_timedelta(durations))]
Out[24]: '14d'
pd.to_timedelta文字列を期間(source)に変換しnp.argmax、最も高い要素のインデックスを返します。
ここでは悪いが、巧妙な方法で問題を解決し、絶対ハックです:Pythonのminとmax機能は一緒に使用することができkey、それは要素、その関数を最小化または最大化を返すように、要素を比較するために使用される機能。key関数がタプルを返す場合、順序は、2番目のコンポーネントをタイブレーカーとして使用して、タプルの最初のコンポーネントによって決定されます。
我々はその最後の文字が事実を利用することができます'd'、'h'そして'm'アルファベット順に比較することができます。Dの AYは、より長い時間、私たちはより長いメートルの inute。つまり、最長の期間はアルファベット順に最小の文字を持ち、最大の整数をタイブレーカーとして使用します。その整数を最大化することは、その否定を最小化することと同じです。
>>> durations = ['5d', '20h', '1h', '7m', '14d', '1m']
>>> min(durations, key=lambda d: (d[-1], -int(d[:-1])))
'14d'
s、週はW、月はMで表すことができますが、それでも機能します。ただし、年yまたは年のどちらかを含めると、ハックが破られますY。また10000000m、より大きな単位を代わりに使用できるような期間がないことにも依存しています。文字列は、常に可能な限り最大の単位を使用するAPIの出力であると想定しています。
ここに正規表現の解決策があります
import numpy as np
import re
new_list = []
x=['5d', '20h', '1h', '7m', '14d', '1m']
map_time={"d":1440, "h":60, "m":1}
for item in x:
letter=re.findall("[a-zA-Z]+",item)
number=re.findall("[1-9]+",item)
new_list.append(map_time[letter[0]]*int(number[0]))
x[np.argmax(new_list)]
時間の形式が適切であればmax、単一の正規表現に基づいてを見つけることができます。
>>> import re
>>>
>>> durations = ['5d', '20h', '1h', '7m', '14d', '1m']
>>> pattern = re.compile(r'(?:(\d*)d)?(?:(\d*)h)?(?:(\d*)m)?')
>>> max(inp, key=lambda tme: tuple(map(int, pattern.match(tme).groups(default=0))))
'14d'
正規表現は、日、時、分のタプルを文字列として作成します。はtuple(map(int, ...))それを整数に変換します。maxこれらのタプルの中で最大のものを選択します。これは、当然、数分よりも長い時間よりも強い日を重み付けします。
1つの可能な方法:
duration = ['5d', '20h', '1h', '7m', '14d', '1m', '2d']
duration_std = [0]*len(duration)
equivalence = {"d":60*60*24, "h":60*60, "m":60}
for idx, val in enumerate(duration):
duration_std[idx] = int(val[:-1])*equivalence[val[-1]]
print(duration[duration_std.index(max(duration_std))])
出力
"14d"