列表的复杂排序

use*_*661 4 python sorting

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

Mar*_*ers 5

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

values.sort(key=somefunction)
Run Code Online (Sandbox Code Playgroud)

其中somefunction有一个参数(要转换的值).

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

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

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

这将改变8:01(8, 1)6:25(18, 25),导致.sort()sorted()排序8:016:25:

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

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