【问题标题】:Finding the closest and furthest value to a list of strings查找与字符串列表最接近和最远的值
【发布时间】:2021-09-15 07:06:16
【问题描述】:

我有一个时间列表和当前时间。我正在尝试找到与当前时间最近和最远的时间。我发现很难用字符串解决这样的任务。

但是,我可以使用 min 和 max 函数在字符串列表中打印最小和最大时间。

我看到@kennytm 使用以下方法发布了类似的问题解决方案: min(myList, key=lambda x:abs(x-myNumber)),但我不完全确定这是否适用于字符串。

谁能为我的问题提供解决方案?

current_time = '09:00'
time = ['09:30','11:50','11:55','11:55','12:00','12:10','12:15','12:25','12:35','12:50','12:55', '13:00']

print(min(time))
# 09:30
print(max(time))
# 13:00

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 结帐datetime。您可以使用 strftime 将字符串转换为日期时间对象
  • @daniboy000 好吧,我尝试了类似于这里的东西:stackoverflow.com/questions/12141150/… 我试图将字符串转换为整数,但这不是因为列表中元素的时间格式。

标签: python string list time


【解决方案1】:

当您将日期转换为datetime 对象时,您可以使用min(time,key=lambda x : abs(current_time-x)) 获得最接近的时间:

from datetime import datetime

current_time = '09:00'
time = ['09:30','11:50','11:55','11:55','12:00','12:10','12:15','12:25','12:35','12:50','12:55', '13:00']

def get_time(time):
  return datetime.strptime(time, '%H:%M')

current_time = get_time(current_time)
time = [get_time(i) for i in time]

print(min(time,key=lambda x : abs(current_time-x)).strftime('%H:%M'))

【讨论】:

    【解决方案2】:

    将 hh:mm 格式转换为单个整数,用于当前时间和时间列表。然后遍历整数,并使用原始时间列表跟踪时间。

    def hhmm2int(t):
        hour_min = t.split(':')
        hours_as_minutes = int(hour_min[0]) * 60
        minutes = int(hour_min[1])
        return hours_as_minutes + minutes
    
    
    current_time = '09:00'
    time = ['09:30', '11:50', '11:55', '11:55', '12:00', '12:10', '12:15', '12:25', '12:35', '12:50', '12:55', '13:00']
    
    current_time = hhmm2int(current_time)
    time_as_int = [hhmm2int(t) for t in time]
    
    min_delta = float('inf')
    max_delta = 0
    closest_time = ''
    furthest_time = ''
    for i in range(len(time_as_int)):
        delta = abs(time_as_int[i] - current_time)
        if delta < min_delta:
            min_delta = delta
            closest_time = time[i]
        if delta > max_delta:
            max_delta = delta
            furthest_time = time[i]
    
    print(closest_time, furthest_time)
    
    

    【讨论】:

      【解决方案3】:

      一个简单的解决方案:

      diff_time = lambda t: abs(int(current_time.replace(':', '')) \
                              - int(t.replace(':', '')))
      

      从 00:00 (int: 0) 到 23:59 (int: 2359),时间已经按字典顺序排列,并且在转换为整数时保持顺序。

      >>> min(time, key=diff_time)
      '09:30'
      
      >>> max(time, key=diff_time)
      '13:00'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-11-14
        • 1970-01-01
        • 2015-07-26
        • 2021-11-20
        • 1970-01-01
        • 2023-03-06
        • 2018-01-02
        相关资源
        最近更新 更多