You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对嵌套列表先按年份排序再按文本月份二次排序?

嵌套列表按年份+文本月份排序问题

我需要对嵌套列表先按年份排序,再按文本格式的月份排序,目前已经实现按年份排序,但二次排序月份时遇到困难。已创建月份映射字典和列表,现有代码及当前输出如下:

from operator import itemgetter

import pandas as pd

month_list = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
months = {
    'Jan': 0,
    'Feb': 1,
    'Mar': 2,
    'Apr': 3,
    'May': 4,
    'Jun': 5,
    'Jul': 6,
    'Aug': 7,
    'Sep': 8,
    'Oct': 9,
    'Nov': 10,
    'Dec': 11,
}
data = [['Sep', '2024', 112], ['Dec', '2022', 79], ['Apr', '2023', 114], ['Aug', '2024', 194], ['May', '2022', 140], ['Jan', '2023', 222]]

half_sorted = sorted(data, key=itemgetter(1))
input(half_sorted)

当前输出:

[['Dec', '2022', 79], ['May', '2022', 140], ['Apr', '2023', 114], ['Jan', '2023', 222], ['Sep', '2024', 112], ['Aug', '2024', 194]]

解决方案

方法1:用Python内置sorted实现多条件排序

直接修改排序的key参数,让它返回一个包含年份(转整数)+月份映射值的元组。sorted会先按元组第一个元素排序,元素相同的再按第二个排序,刚好满足需求:

from operator import itemgetter

month_list = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
months = {
    'Jan': 0,
    'Feb': 1,
    'Mar': 2,
    'Apr': 3,
    'May': 4,
    'Jun': 5,
    'Jul': 6,
    'Aug': 7,
    'Sep': 8,
    'Oct': 9,
    'Nov': 10,
    'Dec': 11,
}
data = [['Sep', '2024', 112], ['Dec', '2022', 79], ['Apr', '2023', 114], ['Aug', '2024', 194], ['May', '2022', 140], ['Jan', '2023', 222]]

# 多条件排序:先按年份(转整数避免字符串排序bug),再按月份映射值
full_sorted = sorted(data, key=lambda x: (int(x[1]), months[x[0]]))
print(full_sorted)

输出结果:

[['May', '2022', 140], ['Dec', '2022', 79], ['Jan', '2023', 222], ['Apr', '2023', 114], ['Aug', '2024', 194], ['Sep', '2024', 112]]

方法2:用Pandas排序(适合大数据量)

既然已经导入了pandas,转成DataFrame处理更直观,还能避免手动维护映射字典:

import pandas as pd

month_list = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
data = [['Sep', '2024', 112], ['Dec', '2022', 79], ['Apr', '2023', 114], ['Aug', '2024', 194], ['May', '2022', 140], ['Jan', '2023', 222]]

# 转成DataFrame
df = pd.DataFrame(data, columns=['Month', 'Year', 'Value'])
# 将月份设为有序分类,指定自定义排序顺序
df['Month'] = pd.Categorical(df['Month'], categories=month_list, ordered=True)
# 先按Year排序,再按Month排序
sorted_df = df.sort_values(by=['Year', 'Month'])
# 转回嵌套列表
full_sorted = sorted_df.values.tolist()
print(full_sorted)

输出结果和方法1完全一致。

内容的提问来源于stack exchange,提问作者Lee Donovan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 23:39:53