将时间从(mm:ss.ddd)转换为(ss.ddd)
我现在有一个字符串列表,格式是 (mm:ss.ddd):
[['0:00.762', '0:01.435'], ['2:01.374', '2:07.423'], ['3:01.412', '3:07.314']]
我想把它们转换成 (ss.ddd) 这种格式:
[['0.762', '1.435'], ['121.374', '127.423'], ['181.412', '187.314']]
简单来说,就是把冒号 ':' 左边的字符拿出来,转成整数,然后乘以 60,再加上冒号 ':' 右边但在 '.' 前面的数字。
我对 Python 的字符串处理工具不太熟悉,所以想问问有没有人能想到一个聪明又高效的方法,利用内置的方法来实现这个转换。
谢谢大家的帮助!
2 个回答
0
from decimal import Decimal
times = [['0:00.762', '0:01.435'], ['2:01.374', '2:07.423'], ['3:01.412', '3:07.314']]
converted_times = [ [str(int(time.split(":")[0])*60 + Decimal(time.split(":")[1])) for time in time_list] for time_list in times]
# thanks @shaktimaan
但是你为什么要用字符串的方法来做这个呢?这里有个更好的方法:
import datetime
times = [['0:00.762', '0:01.435'], ['2:01.374', '2:07.423'], ['3:01.412', '3:07.314']]
def convert_time(times):
for timepair in times:
accumulator = list()
for time in timepair:
t = datetime.datetime.strptime(time,"%M:%S.%f")
accumulator.append("{}.{}".format(t.minute*60+t.second,t.microsecond//1000))
yield accumulator
for timepair in convert_time(times):
print(timepair) # or whatever.
1
让我们把这个问题拆分成几个部分。首先,我们需要一个函数,能够把每个元素从 mm:ss.dd 格式转换成 ss.dd 格式。这其实很简单:
def convert(s):
mins, secs = s.split(':')
mins = int(mins)
secs = float(secs)
secs = 60 * mins + secs
return secs
看起来我们可以直接用 map
来转换列表中的元素:
converted_times = map(convert, orig_times)
不过,convert
这个函数只处理一个单独的元素(比如 '0:00.762'
),而我们的数据实际上是一个列表的列表——具体来说,是一对一对的列表。我们还需要另一个函数,能够接受一对元素(作为一个列表)并返回它们。我们还希望返回的结果是字符串格式,而不是浮点数:
def convert_pair(p):
p0, p1 = convert(p[0]), convert(p[1])
return [str(p0), str(p1)]
把这些结合起来,我们可以简单地这样做
converted_times = map(convert_pair, orig_times)
来转换数据对的列表。
这段代码的示例可以在 这里 找到。