2016-10-22 4 views
0

Я только начиная с Python и интересно, как я бы идти о сортировке этот списокКак отсортировать список раз

с самого раннего времени до последней.

('5:00PM','2:00PM','7:00AM','8:45PM','12:00PM') 

Любая помощь приветствуется.

+0

Что вы пробовали? Показать свою работу. Кроме того, это не список раз, это строки. – Soviut

+0

Каковы ваши условия сортировки? То, что вы показываете, это кортеж, а не список. Вы пытались это сделать? Можете ли вы показать свой код? – idjaw

+2

Напишите функцию, которая возвращает 24-кратное эквивалентное целое число раз в списке, затем используйте его как ключевую функцию для [list.sort()] (https://docs.python.org/3/library/stdtypes.html# list.sort) – wwii

ответ

1

Я рекомендую вам установить пакет PyPi DateTime и использовать эти средства для любых манипуляций, которые вы желаете. Проблема в том, что было бы похоже:

stamps = ('5:00PM','2:00PM','7:00AM','8:45PM','12:00PM') 
DT_stamps = [DateTime(s) for s in stamps] 
DT_stamps.sort() 

Детали реализации остаются как упражнение для ученика. :-)

+0

Это не оставляет результат со списком отсортированных строк. – Soviut

+0

OP объявили их списком раз, а не строками, поэтому я выбрал этот курс. Если истинной проблемой является сортировка строк, то мы получим разъяснение к этому эффекту Real Soon Now. :-) – Prune

1

Если времена всегда будут в этом формате, вы можете разделить их на подразделы.

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.

+0

благодарю вас за ответ!Я считаю, что мне разрешено использовать стандартную библиотеку. – alex756

+0

Без проблем @ alex756 Если какой-либо из этих ответов вам помог, не забывайте поднимать и отмечать один из них как правильный, чтобы другие могли найти ответы. – SCB

1

В 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'] 
0

Что вы показываете не список раза, это кортеж строк. Кортежи неизменяемы и не могут быть отсортированы, могут быть только изменчивые коллекции, такие как списки. Поэтому сначала необходимо преобразовать кортеж в список:

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)) 
+0

Даже в Python2 вы можете просто указать функцию 'key'. Это упростит вашу функцию до простого: 'sorted (times, key = lambda x: time.strptime (x, time_format))'. Примечание. Мне действительно не нравится 'lambdas', но в комментариях трудно« def' -функции. – MSeifert

+0

Я намеренно написал это, чтобы проиллюстрировать, как работает сортировка с помощью специализированного компаратора. ОП пытается научиться и применять это, поэтому один лайнер не так полезен. – Soviut

+0

Если вы считаете полезным проиллюстрировать удаленные функции ('cmp' был удален из отсортированного в Python3), то добавьте предупреждение о том, что ответ работает только с python2. ОП не уточнил свою версию, поэтому, по крайней мере, вероятно, что ваш ответ не сработает для него. :-) – MSeifert

Смежные вопросы