我想对字典进行排序,关键是月-年

时间:2018-08-08 11:51:47

标签: python python-2.7

我想对一个键进行排序的字典是月-年。

例如:对于

APEX$_ACL TABLE APEX$_WS_FILES TABLE APEX$_WS_HISTORY TABLE APEX$_WS_LINKS TABLE APEX$_WS_NOTES TABLE APEX$_WS_ROWS TABLE APEX$_WS_TAGS TABLE APEX$_WS_WEBPG_SECTIONS TABLE APEX$_WS_WEBPG_SECTION_HISTORY TABLE

我的字典键应按以下顺序排序:

March 2017,January 2018,May 2017

该怎么办?

例如:

March 2017,May 2017,January 2018

注意:月度的值是动态地出现的。

3 个答案:

答案 0 :(得分:2)

您需要将键转换为日期,以便它们可以正确排序。假设您的字典称为example_dict

import datetime
keys = list(example_dict.keys())
keys.sort(key=lambda x: datetime.datetime.strptime(x,'%B %Y'))

答案 1 :(得分:1)

您需要使用特殊键功能进行排序:

months = ['January',
          'February',
          'March',
          'April',
          'May',
          'June',
          'July',
          'August',
          'September',
          'October',
          'November',
          'December']

month_num = dict(zip(months, range(12)))


def compare(date):
    month, year = date.split(' ')
    return (year, month_num[month])


dates = {
    'February 2017': {'a': 1.0, 'b': 683.01},
    'March 2018': {'a': 0.0, 'b': 623.79}}

dict(sorted(dates.items(), key=lambda x: compare(x[0])))

答案 2 :(得分:0)

FYI:在中,由于字典是“无序的”,可以这么说,由于两个键具有相同的值,因此原始帖子中的字典在语法上是不正确的。解释器将覆盖其中之一。

根据您的原始帖子,我认为其中之一应为2018年5月,这就是我用来回答的字典:

{'February 2017': {'a': 1.0, 'b': 683.01}, 
 'May 2018': {'a': 0.0, 'b': 623.79}, 
 'March 2018': {'a': 1.0, 'b': 683.01}}

由于如上所述,字典的排序不明显(哈希值),因此我们必须转换为列表然后试一下。一种衬板解决方案如下:

sorted(list(data.items()), key=lambda x: [x[0].split()[-1], x[0].split()[0], x[1]])

您将获得如下输出:

>>> sorted(list(data.items()), key=lambda x: [x[0].split()[-1], x[0].split()[0], x[1]])
[('February 2017', {'a': 1.0, 'b': 683.01}), ('March 2018', {'a': 1.0, 'b': 683.01}), ('May 2018', {'a': 0.0, 'b': 623.79})]
>>>