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