【问题标题】:Sorting a dict by keys consisting of numbers and letters按由数字和字母组成的键对字典进行排序
【发布时间】:2020-05-27 16:53:46
【问题描述】:

我有一个包含不同季度(年份)的数据的字典:

"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,
    },

【问题讨论】:

  • 你为什么需要它?很长一段时间以来,字典都是无序的,我们忍受着它。只有少数复杂的情况我实际上使用了排序,它只是为了帮助调试

标签: python sorting dictionary-comprehension


【解决方案1】:

字典无法就地排序,因为它们没有顺序,但从 Python 3.7 开始,它们会记住插入顺序,因此我们可以通过对无序字典中的键值对进行排序来构建“有序”字典。

所以真正重要的部分是我们作为参数传递给sortedkey。在下面的代码中,键是一个 lambda 函数,它获取每个键,将其拆分为 / 并将结果元组反转,以便键首先按年份排序,然后按季度排序:

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)

输出:

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

【讨论】:

    【解决方案2】:

    您应该将此字典复制到 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
    }
    
    

    【讨论】:

    • 你看sorted之后你的key的顺序了吗?
    • 问题是您仍然需要对年份进行排序,但这是处理季度的好方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-17
    • 2020-08-24
    • 2011-06-30
    相关资源
    最近更新 更多