Определить отсортированную функцию для меток времени / объектов времени по ключу
У меня есть словарь времен и подсчетов. Мне нужно отсортировать слова так, чтобы они были в порядке возрастания времени. Мне нужна помощь, чтобы получить что-то полезное. Прямо сейчас я отбрасываю AM/PM, чтобы устранить сложность, но я знаю, что у меня возникла проблема, так как я теряю информацию.
призвание
sorted(myDict, key = bytime_key)
с
def bytime_key(input):
shorter_input = re.match(r'^(.*) \w\w$', input).group(1)
time = datetime.strptime(shorter_input, '%m/%d/%Y %H:%M:%S')
return(time)
хорошо, за исключением того, что это на самом деле не меняет порядок, поэтому я здесь упускаю что-то фундаментальное.
Образец словаря
myDict = {'1/15/2016 10:41:00 AM': 11, '1/15/2016 10:43:00 AM': 4,
'1/15/2016 10:22:00 AM': 46, '1/15/2016 10:30:00 AM': 15,
'1/15/2016 10:59:00 AM': 34, '1/15/2016 12:06:00 PM': 12,
'1/15/2016 11:42:00 AM': 11, '1/15/2016 12:22:00 PM': 1,
'1/15/2016 12:18:00 PM': 5, '1/15/2016 10:52:00 AM': 6}
4 ответа
strptime позволяет %p
директивы.
%p
Локальный эквивалент AM или PM. AM, PM (en_US); утра, вечера (de_DE) (1), (2)
Функция ключа может быть упрощена до:
from datetime import datetime
result = sorted(myDict, key=lambda s: datetime.strptime(s, "%m/%d/%Y %H:%M:%S %p"))
expected = ['1/15/2016 10:22:00 AM', '1/15/2016 10:30:00 AM',
'1/15/2016 10:41:00 AM', '1/15/2016 10:43:00 AM',
'1/15/2016 10:52:00 AM', '1/15/2016 10:59:00 AM',
'1/15/2016 11:42:00 AM', '1/15/2016 12:06:00 PM',
'1/15/2016 12:18:00 PM', '1/15/2016 12:22:00 PM']
assert result == expected
Обратите внимание, что словари по своей природе являются несортированными структурами. Что вы можете сделать, это выполнить сортировку пар ключ / значение / ключ-значение и создать упорядоченное представление данных, отсортированных в словаре. И это то, что делает ваш код - он сортирует ключи.
Стандартные словари Python являются неупорядоченными и не сохраняют порядок сортировки.
Вы можете использовать OrderedDict, чтобы упорядочить элементы в словаре в зависимости от времени их вставки.
from collections import OrderedDict
ordered_times = OrderedDict(sorted(myDict.keys(), key=bytime_key))
На ум приходят 2 проблемы. Во-первых, диктанты не сортируются. Вы можете использовать OrderedDict
, Во-вторых, отсортированный не сортирует первый аргумент, он возвращает отсортированную копию первого аргумента.
Попробуйте изменить строку в bytime_key
от:
shorter_input = re.match(r'^(.*) \w\w$', input).group(1)
в
shorter_input = re.match(r'^(.*) \w\w$', input[0]).group(1)
Затем получите OrderedDict, используя:
from collections import OrderedDict
my_sorted_dict = OrderedDict(sorted(myDict.iteritems(), key = bytime_key))
Sorted возвращает новый список, поэтому он не изменит ваш словарь. Попробуйте использовать list.sort () для сортировки на месте.
Словари не имеют порядка, связанного с ними. Они очень быстро (O (1)) при поиске предметов, но не так полезны для других операций.
Попробуйте использовать список кортежей (timestamp, count) или OrderedDictionary.