【问题标题】:simplifying function简化函数
【发布时间】:2013-01-11 02:36:24
【问题描述】:

我已经编写了这个函数,我认为它会起作用,但我不能 100% 确定。但我很好奇这很复杂。有什么方法可以让这更简单?

这三个参数是时间,格式为“HH:MM”,其中 00

(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

【问题讨论】:

    标签: python string int slice typeconverter


    【解决方案1】:

    我会使用m = int(HH) * 60 + int(MM)HH: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'
    

    【讨论】:

    • 如果我不能更改表格怎么办?这是我能做的最好的吗?
    • 由于“最接近”的概念取决于计算两个时间戳之间的差异,因此几乎任何正确的解决方案都必须处理 HH 字段为 MM 字段的 60 倍。你怎么知道 09:50 比 10:15 更接近 10:01?
    • 另外,FWIW,您的原始代码包含像(int(answer[3:]) 这样的片段。那时,您已经改变了形式:-) 将字符串转换为整数(因为不能减去字符串)并将小时乘以 60(因为小时和分钟是相同物理量的两个不同比例的测量值),这是无可避免的, 时间)。
    • @DSM 当时间差相等时,OP的示例代码的最后一行返回guess1
    猜你喜欢
    • 2015-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多