2017-07-12 60 views
-2

在字符串中我有数据,表示正在运行的比赛时间。 例如,我有一个字符串,我想比较0,我想打印最接近他们的字符串。比较python中的三个字符串

录入时间:那段时间之间37:30

字符串:37:31 and 36:50

所以我想打印出来37:31

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

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

我不想字符串转换为秒。

+1

请提供[最小,完整,可验证的示例](https://stackoverflow.com/帮助/ mcve) – klutt

回答

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' 
+0

给定时间格式的很好的简短解决方案。但如果我有......:mm:ss格式,它不能转换为浮点数 –

+0

@KubaRonkiewicz在我的文章中查看编辑 – Dadep

3

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

不想转换为秒是一个问题。您需要最小的距离,并且需要计算输入时间和候选时间之间的差异。没有简单的方法来计算两个字符串之间的差异,它们将按照您的要求进行。有什么反对做转换?

+0

为什么我不想进行转换?因为我对不同的距离有不同的时间格式(hh:mm:ss,mm:ss,ss.ms),所以我需要编写更多if/else条件。 –

1

不转换为秒,您可以比较字符串,但无法计算它们之间的差异。对于你的情况,差异是相关的,因为你想打印最近的时间。这样做:

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