【问题标题】:Compare three strings in python在python中比较三个字符串
【发布时间】:2023-03-31 08:56:01
【问题描述】:

在字符串中我有数据,代表跑步比赛时间。 例如,我有一个要比较的字符串0,我想打印最接近它们的字符串。

输入时间:37:30

这段时间之间的字符串:37:31 and 36:50

所以我想打印出37:31

我的条件是错误的,因为它打印了36:50

for i in list:
    if i <= time:
       print i
       break

我不想将字符串转换为秒。

【问题讨论】:

标签: python string time string-comparison


【解决方案1】:

您的测试失败了,因为它报告第一次发现的次数少,而不是最近的次数。

不想转换为秒是个问题。您想要最小的距离,这需要计算输入时间和候选时间之间的差异。没有简单的方法可以计算两个字符串之间的差异来满足您的需求。进行转换的反对意见是什么?

【讨论】:

  • 为什么我不想进行转换?因为我对于不同的距离有不同的时间格式(hh:mm:ss, mm:ss, ss.ms),所以需要多写一些if/else条件。
【解决方案2】:

您可以将列表转换为浮点数,然后找到最小的差异。但正如 BoarGules 所说,您不能以这种方式比较字符串。

这里有一个你可以做什么的例子:

>>> list 
['37:30', '36:51', '37:29'] 
>>> time
'37:28'
>>> list2=[float('.'.join(i.split(':'))) for i in list]
>>> time2=float('.'.join(time.split(':')))
>>> min(list2, key=lambda x:abs(x-time2))
37.29

编辑

>>> list=['12:37:21', '11:23:15', '12:37:28']
>>> time='11:24:12'
>>> list2=[int(''.join(i.split(':'))) for i in list]
>>> time2=int(''.join(time.split(':')))
>>> out=str(min(list2, key=lambda x:abs(x-time2)))
>>> out=out[:2]+':'+out[2:4]+':'+out[4:]
>>> out
'11:23:15'

【讨论】:

  • 给定时间格式的非常好的简短解决方案。但是如果我有 hh:mm:ss 格式,它就不能转换为浮点数
  • @KubaRonkiewicz 请参阅我的帖子中的编辑
【解决方案3】:

如果不转换为秒,您可以比较字符串,但无法计算它们之间的差异。对于您的情况,差异是相关的,因为您要打印最接近的时间。执行以下操作:

def convert(string):
    min, sec = string.split(':')
    return min*60 + sec

假设您的 list 按升序排序,请执行以下检查:

for i in range(len(list)):
    if list[i] > time:
        if i == 0: # the very first string is greater, so it's also the closest
            print(list[i])
            break
        diff1 = convert(time) - convert(list[i-1])
        diff2 = convert(list[i]) - convert(time)
        if diff1 < diff 2: # lis[i-1] is closer
            print(list[i-1])
        else:
            print(list[i])
        break

【讨论】:

    猜你喜欢
    • 2015-03-10
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-21
    • 2016-08-19
    • 1970-01-01
    • 2012-06-14
    相关资源
    最近更新 更多