列表的复杂排序

时间:2013-01-15 12:33:14

标签: python sorting

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

2 个答案:

答案 0 :(得分:5)

使用key参数list.sort()sorted()功能提供值进行排序。

values.sort(key=somefunction)

其中somefunction接受一个参数(要转换的值)。

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

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

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

会将8:01转换为(8, 1),将6:25转换为(18, 25),从而导致.sort()sorted()8:01进行排序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 cache link,直到wiki.python.org从最近的security exploit恢复。)

答案 1 :(得分:4)

函数to_minutes将字符串转换为整数小时和分钟,并计算从8:00开始的分钟数,在8:00之前添加12小时。然后按照这个分钟数进行排序:

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']