Python 列表的复杂排序

Python 列表的复杂排序,python,sorting,Python,Sorting,我有一个字符串格式的时间列表,从上午8:00到晚上7:00。未指定am/pm,且不可使用24小时时钟。我想按时间对这个列表进行排序,但在时钟敲响一点之后,我遇到了一些问题,因为数字排序从一开始,尽管事实上8-12在时间上比这早。我想我可以创建一个新的元组列表,在这个列表中,我通过一个函数运行times,该函数将元组转换为一个更合适的数字,并对其进行排序,然后在需要的函数中使用元组的第一个元素。这似乎是可行的,但我担心我可能错过了一些更加优雅和基本的东西。是吗 使用键参数对list.sort()或

我有一个字符串格式的时间列表,从上午8:00到晚上7:00。未指定am/pm,且不可使用24小时时钟。我想按时间对这个列表进行排序,但在时钟敲响一点之后,我遇到了一些问题,因为数字排序从一开始,尽管事实上8-12在时间上比这早。我想我可以创建一个新的元组列表,在这个列表中,我通过一个函数运行times,该函数将元组转换为一个更合适的数字,并对其进行排序,然后在需要的函数中使用元组的第一个元素。这似乎是可行的,但我担心我可能错过了一些更加优雅和基本的东西。是吗

使用
参数对
list.sort()
sorted()
函数提供排序依据的值

values.sort(key=somefunction)
其中
somefunction
接受一个参数(要转换的值)

然后根据
参数的返回值对列表进行排序,但原始值本身保持不变

对于您的问题,您可以使用:

def daytime(val):
    hour, min = map(int, val.split(':'))
    if hour < 8:
        hour += 12
    return hour, min

有关更多详细信息和提示,请参见(在
wiki.python.org
从最近的事件中恢复之前使用此函数)。

函数
to_minutes
将字符串转换为整数小时和分钟,并计算自8:00以来的分钟数,将12小时添加到8:00之前的时间。然后,它根据分钟数进行排序:

def to_minutes(s):
    h,m = map(int, s.split(':'))
    return ((h - 8) % 12) * 60 + m

a = ['1:45', '8:00', '6:15', '12:30']
print sorted(a, key=to_minutes)
印刷品

['8:00', '12:30', '1:45', '6:15']

为什么不将数字存储在更易于排序的格式中,然后动态转换它们呢?自然的选择是
datetime
对象。
['8:00', '12:30', '1:45', '6:15']