4

我有一个从上午 8:00 到下午 7:00 的时间列表,格式为字符串。没有指定上午/下午,并且不能选择使用 24 小时制。我想按时间对这个列表进行排序,但在时钟敲响后我遇到了问题,因为数字排序从 1 开始,尽管事实上 8-12 实际上在时间之前。我在想我可以创建一个新的元组列表,在其中我通过一个函数运行时间,将它们转换为更合适的数字,对其进行排序,并在需要它的函数中使用元组的第一个元素。这似乎可行,但我担心我可能会遗漏一些更优雅和基本的东西。我是吗?

4

2 回答 2

5

使用key参数 tolist.sort()sorted()函数提供要排序的值。

values.sort(key=somefunction)

wheresomefunction接受一个参数(要转换的值)。

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

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

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

这将转换8:01(8, 1)and 6:25to (18, 25),导致.sort()or sorted()to sort 8:01before 6:25

>>> sorted(['1:14', '8:01', '12:46', '6:25'], key=daytime)
['8:01', '12:46', '1:14', '6:25']

有关更多详细信息和提示,请参阅Python Sorting HOWTO(使用此Google 缓存链接,直到wiki.python.org从最近的安全漏洞中恢复)。

于 2013-01-15T12:34:59.210 回答
4

该函数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']
于 2013-01-15T12:37:34.300 回答