Определить отсортированную функцию для меток времени / объектов времени по ключу

У меня есть словарь времен и подсчетов. Мне нужно отсортировать слова так, чтобы они были в порядке возрастания времени. Мне нужна помощь, чтобы получить что-то полезное. Прямо сейчас я отбрасываю 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.

Другие вопросы по тегам