如何对嵌套列表先按年份排序再按文本月份二次排序?
嵌套列表按年份+文本月份排序问题
我需要对嵌套列表先按年份排序,再按文本格式的月份排序,目前已经实现按年份排序,但二次排序月份时遇到困难。已创建月份映射字典和列表,现有代码及当前输出如下:
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
相关产品推荐
相关产品推荐

