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