用数字和字母组成的键对字典排序

时间:2020-05-27 16:53:46

标签: python sorting dictionary-comprehension

我有一个字典,其中包含有关(季度)不同季度的数据:

"data": {
        "Q3/2016": 86,
        "Q1/2016": 85,
        "Q4/2016": 69,
        "Q2/2016": 69,
        "Q2/2017": 82,
        "Q1/2017": 66,
    },

如何对它进行排序,使其看起来像这样

"data": {
        "Q1/2016": 85,
        "Q2/2016": 69,
        "Q3/2016": 86,
        "Q4/2016": 69,
        "Q1/2017": 66,
        "Q2/2017": 82,
    },

2 个答案:

答案 0 :(得分:2)

由于字典没有顺序,因此无法就地进行排序,但是自Python 3.7起,他们便会记住插入顺序,因此我们可以通过对无序字典中的键值对进行排序来构建“有序”字典。

因此,实际的重要部分是我们作为参数传递给key的{​​{1}}。在下面的代码中,键是一个lambda函数,该函数获取每个键,将其在sorted处进行拆分,并反转结果元组,以便首先按年份对键进行排序,然后按季度对键进行排序:

/

输出:

d = {"data": { 
    "Q3/2016": 86, 
    "Q1/2016": 85, 
    "Q4/2016": 69, 
    "Q2/2016": 69, 
    "Q2/2017": 82, 
    "Q1/2017": 66, 
    }
}
d['data'] = {k: v for k, v in sorted(d['data'].items(), key=lambda x: x[0].split('/')[::-1])}
print(d)

答案 1 :(得分:1)

您应将此字典复制到ordered dict中,例如

In [22]: from collections import OrderedDict
In [23]: data = {
    ...:         "Q3/2016": 86,
    ...:         "Q1/2016": 85,
    ...:         "Q4/2016": 69,
    ...:         "Q2/2016": 69,
    ...:         "Q2/2017": 82,
    ...:         "Q1/2017": 66,
    ...:     }
In [40]: def sort_key(key_val):
    ...:     key, val = key_val
    ...:     key = key.split("/")
    ...:     return int(key[1]), key[0]
    ...:
# add a custom sort key
In [24]: data = OrderedDict(sorted(data.items(), key=sort_key))

In [25]: data
Out[25]:
OrderedDict([('Q1/2016', 85),
             ('Q2/2016', 69),
             ('Q3/2016', 86),
             ('Q4/2016', 69),
             ('Q1/2017', 66),
             ('Q2/2017', 82)])

似乎在json序列化的同时也保持顺序

In [27]: print(json.dumps(data, indent=4))
{
    "Q1/2016": 85,
    "Q2/2016": 69,
    "Q3/2016": 86,
    "Q4/2016": 69,
    "Q1/2017": 66,
    "Q2/2017": 82
}

相关问题