在格式中找到包含时间元组的列表中的最大时间值('小时','分钟','上午/下午')

Pod*_*odo 5 python sorting datetime list max

我有一个代表不同时间的元组列表

timeList = [('4', '12', 'PM'), ('8', '23', 'PM'), ('4', '03', 'AM'), ('1', '34', 'AM'), 
('12', '48', 'PM'), ('4', '13', 'AM'), ('11', '09', 'AM'), ('3', '12', 'PM'), 
('4', '10', 'PM')]
Run Code Online (Sandbox Code Playgroud)

我希望从列表中返回最大值,经过一些搜索后,我意识到我可以使用最大键来首先搜索AM或PM.
print(max(timeList, key = operator.itemgetter(2)))

然而,当我运行这个时,我得到了错误的最大值,('4', '12', 'PM') 我想到了它,不仅没有意义,因为8:23应该是最大值,但我也意识到12:48可能会返回最大值,因为它是在我的搜索中,PM和技术上大于8.

话虽如此,如果无法更改列表的格式,我怎么能得到最大值才能找到最新的可能时间.

jua*_*aga 5

只需定义一个合适的键功能.你想int(hour),int(minute)并且'PM'已经字典顺序高于"AM",但应考虑首先,就这样.此外,您需要采用小时模数12,以便12排序小于其他数字,在pm/中am:

In [39]: timeList = [('4', '12', 'PM'), ('8', '23', 'PM'), ('4', '03', 'AM'), ('1', '34', 'AM'),
    ...: ('12', '48', 'PM'), ('4', '13', 'AM'), ('11', '09', 'AM'), ('3', '12', 'PM'),
    ...: ('4', '10', 'PM')]

In [40]: def key(t):
...:     h, m, z = t
...:     return z, int(h)%12, int(m)
...:

In [41]: max(timeList,key=key)
Out[41]: ('8', '23', 'PM')
Run Code Online (Sandbox Code Playgroud)

但是最有意义的是实际使用datetime.time对象,而不是假装一个字符串元组是一种存储时间的好方法.

所以类似于:

In [49]: def to_time(t):
    ...:     h, m, z = t
    ...:     h, m = int(h)%12, int(m)
    ...:     if z  == "PM":
    ...:         h += 12
    ...:     return datetime.time(h, m)
    ...:

In [50]: real_time_list = list(map(to_time, timeList))

In [51]: real_time_list
Out[51]:
[datetime.time(16, 12),
 datetime.time(20, 23),
 datetime.time(4, 3),
 datetime.time(1, 34),
 datetime.time(12, 48),
 datetime.time(4, 13),
 datetime.time(11, 9),
 datetime.time(15, 12),
 datetime.time(16, 10)]

In [52]: list(map(str, real_time_list))
Out[52]:
['16:12:00',
 '20:23:00',
 '04:03:00',
 '01:34:00',
 '12:48:00',
 '04:13:00',
 '11:09:00',
 '15:12:00',
 '16:10:00']
Run Code Online (Sandbox Code Playgroud)

注意,现在max"正常":

In [54]: t = max(real_time_list)

In [55]: print(t)
20:23:00
Run Code Online (Sandbox Code Playgroud)

如果你需要一个漂亮的字符串来打印,那么只需要进行格式化:

In [56]: print(t.strftime("%I:%M %p"))
08:23 PM
Run Code Online (Sandbox Code Playgroud)