Чистый способ создания списка часов

Я хотел бы создать список часов, который является кортежем 24-часового времени (в цифре) и строкового представления 12-часового времени.

Формат будет таким:

[(0, "12 AM"), (1, "1 AM), ..., (13, "1PM"), ... ] 

Я смог получить что-то вроде этого

 hours = [(0,"12 AM")] hours += [(hour,str(hour) + " AM") for hour in range(1, 12)] hours += [(12,"12 PM")] hours += [(hour+12,str(hour) + " PM") for hour in range(1, 12)] 

Но я чувствую, что есть более чистый способ сделать это, но не могу понять это.

 import datetime as dt hours = [(i, dt.time(i).strftime('%I %p')) for i in range(24)] 
 >>> hours = [(n, "%d %s" % (n % 12 or 12, ["AM", "PM"][n > 11])) for n in range(24)] >>> hours [(0, '12 AM'), (1, '1 AM'), (2, '2 AM'), (3, '3 AM'), (4, '4 AM'), (5, '5 AM'), (6, '6 AM'), (7, '7 AM'), (8, '8 AM'), (9, '9 AM'), (10, '10 AM'), (11, '11 AM'), (12, '12 PM'), (13, '1 PM'), (14, '2 PM'), (15, '3 PM'), (16, '4 PM'), (17, '5 PM'), (18, '6 PM'), (19, '7 PM'), (20, '8 PM'), (21, '9 PM'), (22, '10 PM'), (23, '11 PM')] 

Вот еще один лайнер для вас:

 [(hour24, '%d %s' % (hour12, (lambda x: 'AM' if x < 12 else 'PM')(hour24))) for hour12, hour24 in zip(([12]+range(1, 12)*2), range(0, 24))] 

Я также нашел альтернативу, которую я использую в качестве генератора:

 def dayrange(start_date): for n in range(25): yield start_date + i*timedelta(hours = 1) 

с start_date – объект datetime.datetime.