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