简化功能

use*_*828 2 python string int typeconverter slice

我写了这个函数,我认为它会起作用,但我不是100%肯定.但我很好奇这很复杂.我能用这种方式更简单吗?

这三个参数是'HH:MM'形式的时间,其中00 <= HH <= 23且00 <= MM <= 59.前两次是时间估计,第三次是实际时间.返回最接近实际时间的前两个参数之一的时间估计值.如果它们同样接近,则第一次返回.

(str, str, str) -> str  


def closest_time(guess1, guess2, answer):
    if abs((int(answer[:2])) - (int(guess1[:2])) > ((int(answer[:2])) - int(guess2[:2]))):
        return guess2
    if abs((int(answer[:2])) - (int(guess1[:2])) < ((int(answer[:2])) - int(guess2[:2]))):
        return guess1
    if abs((int(answer[:2])) - (int(guess1[:2])) == ((int(answer[:2])) - int(guess2[:2]))):
        if abs((int(answer[3:])) - (int(guess1[3:])) > ((int(answer[3:])) - int(guess2[3:]))):
            return guess2
        if abs((int(answer[3:])) - (int(guess1[3:])) < ((int(answer[3:])) - int(guess2[3:]))):
            return guess1
        if abs((int(answer[3:])) - (int(guess1[3:])) == ((int(answer[3:])) - int(guess2[3:]))):
            return guess1
Run Code Online (Sandbox Code Playgroud)

Ray*_*ger 5

我会HH:MM使用从表格转换为分钟m = int(HH) * 60 + int(MM).这应该会大大简化问题.

把它们放在一起:

>>> def to_minutes(s):
        return int(s[:2]) * 60 + int(s[-2:])

>>> def closest_time(guess1, guess2, answer):
        g1, g2, a = map(to_minutes, [guess1, guess2, answer])
        return guess1 if abs(g1 - a) <= abs(g2 - a) else guess2

>>> closest_time('08:05', '10:30', '08:10')
'08:05'
>>> closest_time('08:05', '10:30', '10:05')
'10:30'
Run Code Online (Sandbox Code Playgroud)

  • 由于"最接近"的概念取决于计算两个时间戳之间的差异,所以**任何**正确的解决方案都必须将*HH*字段视为*MM*字段的六十倍.你怎么知道09:50比10:15更接近10:01? (2认同)
  • 另外,FWIW,你的原始代码包含像``(int(answer [3:])``这样的片段.那时,你已经改变了形式:-)没有把字符串转换成整数(因为字符串可以'减去)并将小时乘以60(因为小时和分钟是相同物理量,时间的两个不同比例的测量值). (2认同)