Я только начиная с Python и интересно, как я бы идти о сортировке этот списокКак отсортировать список раз
с самого раннего времени до последней.
('5:00PM','2:00PM','7:00AM','8:45PM','12:00PM')
Любая помощь приветствуется.
Я только начиная с Python и интересно, как я бы идти о сортировке этот списокКак отсортировать список раз
с самого раннего времени до последней.
('5:00PM','2:00PM','7:00AM','8:45PM','12:00PM')
Любая помощь приветствуется.
Я рекомендую вам установить пакет PyPi DateTime и использовать эти средства для любых манипуляций, которые вы желаете. Проблема в том, что было бы похоже:
stamps = ('5:00PM','2:00PM','7:00AM','8:45PM','12:00PM')
DT_stamps = [DateTime(s) for s in stamps]
DT_stamps.sort()
Детали реализации остаются как упражнение для ученика. :-)
Если времена всегда будут в этом формате, вы можете разделить их на подразделы.
x = "12:30PM"
# Use python's string slicing to split on the last two characters
time, day_half = x[:-2], x[-2:]
# Use python's string.split() function to get the difference between hours and minutes
# Because "11" < "2" for strings, we need to convert them to integers
hour, minute = [int(t) for t in time.split(":")]
# Get the remainder because 12 should actually be 0
hour = hour % 12
# Output it as a tuple, which sorts based on each element from left to right
sortable = (day_half, hour, minute)
#: ("PM", 12, 30)
Чтобы обернуть все это, использовать что-то вроде:
def sortable_time(time_str):
time, day_half = time_str[:-2], time_str[-2:]
hour, minute = [int(t) for t in time.split(":")]
hour = hour % 12
return day_half, hour, minute
# When sorting, use `key` to define the method we're sorting with
# (The returned list however, will be filled with the original strings)
result = sorted(your_time_list, key=sortable_time)
#: ['7:00AM', '12:00PM', '2:00PM', '5:00PM', '8:45PM']
Если вы не гарантированно иметь две буквы в конце, или двоеточие в середине, вы лучше используя библиотеку, такую как предложенная Prune.
В Python3 только с стандартной библиотекой:
import time
hours = ('5:00PM','2:00PM','7:00AM','8:45PM','12:00PM')
format = '%I:%M%p'
time_hours = [time.strptime(t, format) for t in hours]
result = [time.strftime(format, h) for h in sorted(time_hours)]
assert result == ['07:00AM', '12:00PM', '02:00PM', '05:00PM', '08:45PM']
Что вы показываете не список раза, это кортеж строк. Кортежи неизменяемы и не могут быть отсортированы, могут быть только изменчивые коллекции, такие как списки. Поэтому сначала необходимо преобразовать кортеж в список:
times = ['5:00PM','2:00PM','7:00AM','8:45PM','12:00PM']
Вы можете попробовать сортировать этот список в настоящее время, но строки не будут отсортированы так, как вы ожидаете. Вместо этого вам нужно создать собственную функцию сортировки, которая временно преобразует значения в список в объекты struct_time
и сортирует их.
import time
time_format = '%I:%M%p' # match hours, minutes and AM/PM
def compare_as_time(time_str1, time_str2):
# parse time strings to time objects
time1 = time.strptime(time_str1, time_format)
time2 = time.strptime(time_str2, time_format)
# return comparison, sort expects -1, 1 or 0 to determine order
if time1 < time2:
return -1
elif time1 > time2:
return 1
else:
return 0
Теперь вы можете позвонить sorted()
и передать в списке и пользовательской функции сравнения, и вы получите список строк назад, отсортирован по времени в этих строках:
sorted_times = sorted(times, compare_as_time)
Примечание для Python 3: Предыдущий пример предполагает Python 2. Если вы используете Python 3, вам нужно преобразовать функцию сравнения в key function
. Это можно сделать, используя functools.cmp_to_key()
следующим образом:
form functools import cmp_to_key
sorted_times = sorted(times, key=cmp_to_key(compare_as_time))
Даже в Python2 вы можете просто указать функцию 'key'. Это упростит вашу функцию до простого: 'sorted (times, key = lambda x: time.strptime (x, time_format))'. Примечание. Мне действительно не нравится 'lambdas', но в комментариях трудно« def' -функции. – MSeifert
Я намеренно написал это, чтобы проиллюстрировать, как работает сортировка с помощью специализированного компаратора. ОП пытается научиться и применять это, поэтому один лайнер не так полезен. – Soviut
Если вы считаете полезным проиллюстрировать удаленные функции ('cmp' был удален из отсортированного в Python3), то добавьте предупреждение о том, что ответ работает только с python2. ОП не уточнил свою версию, поэтому, по крайней мере, вероятно, что ваш ответ не сработает для него. :-) – MSeifert
Что вы пробовали? Показать свою работу. Кроме того, это не список раз, это строки. – Soviut
Каковы ваши условия сортировки? То, что вы показываете, это кортеж, а не список. Вы пытались это сделать? Можете ли вы показать свой код? – idjaw
Напишите функцию, которая возвращает 24-кратное эквивалентное целое число раз в списке, затем используйте его как ключевую функцию для [list.sort()] (https://docs.python.org/3/library/stdtypes.html# list.sort) – wwii