我有一本时间和重要的字典。我需要对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}
答案 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。