Лично я думаю, что простой анализ строки намного проще для чтения:
>>> s = '02:40'
>>> int(s[:-3]) * 60 + int(s[-2:])
160
Обратите внимание, что использование отрицательного индексирования означает, что он будет обрабатывать строки без начального нуля в часе:
>>> s = '2:40'
>>> int(s[:-3]) * 60 + int(s[-2:])
160
Вы также можете использовать функцию split()
:
>>> hours, minutes = s.split(':')
>>> int(hours) * 60 + int(minutes)
160
или использовать функцию map()
для преобразования частей в целые числа:
>>> hours, minutes = map(int, s.split(':'))
>>> hours * 60 + minutes
160
Скорость
Использование модуля timeit
означает, что он также быстрее, чем другие методы, предлагаемые здесь:
>>> import timeit
>>> parsetime = timeit.timeit("mins = int(s[:-3]) * 60 + int(s[-2:])", "s='02:40'", number=100000) / 100000
>>> parsetime
9.018449783325196e-06
Метод split()
немного медленнее:
>>> splittime = timeit.timeit("hours,minutes = s.split(':'); mins=int(hours)*60 + int(minutes)", "s='02:40'", number=100000)/100000
>>> splittime
1.1217889785766602e-05
>>> splittime/parsetime
1.2438822697120402
И использование map()
снова немного медленнее:
>>> splitmaptime = timeit.timeit("hours,minutes = map(int, s.split(':')); mins=hours*60 + minutes", "s='02:40'", number=100000)/100000
>>> splitmaptime
1.3971350193023682e-05
>>> splitmaptime/parsetime
1.5491964282881776
Карта Джона Мачина и сумма примерно в 2,4 раза медленнее:
>>> summaptime = timeit.timeit('mins=sum(map(lambda x, y: x * y, map(int, "2:40".split(":")), [60, 1]))', "s='02:40'", number=100000) / 100000
>>> summaptime
2.1276121139526366e-05
>>> summaptime/parsetime
2.43
Ответ на основе strptime()
Хроно Кицунэ в десять раз медленнее:
>>> strp = timeit.timeit("t=time.strptime(s, '%H:%M');mins=t.tm_hour * 60 + t.tm_min", "import time; s='02:40'", number=100000)/100000
>>> strp
9.0362770557403569e-05
>>> strp/parsetime
10.019767557444432