按键定义时间戳/时间对象的排序函数

时间:2016-01-15 22:23:06

标签: python python-2.7 sorteddictionary

我有一本时间和重要的字典。我需要对dict进行排序,以便它按时间按升序排列。我需要帮助来获得有用的东西。现在我正在放弃上午/下午以消除复杂性,但我知道我遇到了一个问题,因为我失去了信息。

调用

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 个答案:

答案 0 :(得分:2)

strptime允许%p指令。

  

%p Locale相当于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

请注意,字典本质上是未排序的结构。您可以做的是执行键/值/键值对的排序,并创建按字典排序的数据的有序表示。这就是你的代码所做的事情 - 它对密钥进行排序。

答案 1 :(得分:1)

标准Python字典是无序的,不会保留排序中的任何排序。

您可以使用OrderedDict根据插入时间对字典中的项目进行排序。

from collections import OrderedDict

ordered_times = OrderedDict(sorted(myDict.keys(), key=bytime_key))

答案 2 :(得分:0)

有两个问题浮现在脑海中。 1,dicts不可排序。您可能想要使用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))

答案 3 :(得分:0)

Sorted会返回一个新列表,因此无法修改您的字典。请考虑使用list.sort()进行排序。

Dictionaries没有订单与他们相关联。它们在查找项目时非常快(O(1)),但对其他操作没有用。

考虑使用元组列表(时间戳,计数)或OrderedDictionary