首页 > 解决方案 > 如何在 Python 中对列表中的列进行排序

问题描述

有一个像这样的列表

List = [['19-03-2006', 10000 ], 
    ['02-09-2006', 68 ], 
    ['03-07-2006', 300 ], 
    ['03-07-2006', 80 ], 
    ['03-07-2006', 200 ], 
    ['03-07-2006', 30 ]]

尝试输出如下:

List =  [['19-03-2006', 30 ]] 
         ['19-03-2006', 10000 ], 
         ['03-07-2006', 300 ],
         ['02-09-2006', 68 ], 
         ['02-09-2006', 80 ],   
         ['15-10-2006', 200 ]]

首先按日期排序,从最早到最晚,然后按数字从低到高排序。如果不使用日期时间之类的模块,我怎么能做到这一点。

标签: python

解决方案


您可以使用良好的旧比较器转换为键功能。从 Python 3.2 开始,标准库中添加了 functools.cmp_to_key() 函数

from functools import cmp_to_key

def comparator(a, b):
    a_date, a_num = a
    b_date, b_num = b
    
    a_date = tuple(map(int, reversed(a_date.split("-"))))
    b_date = tuple(map(int, reversed(b_date.split("-"))))
    
    # By year
    if a_date[0] > b_date[0]:
        return 1
    elif a_date[0] < b_date[0]:
        return -1
    else:
        # By month
        if a_date[1] > b_date[1]:
            return 1
        elif a_date[1] < b_date[1]:
            return -1
        else:
            # By day
            if a_date[2] > b_date[2]:
                return 1
            elif a_date[2] < b_date[2]:
                return -1
            else:
                # By number
                if a_num > b_num:
                    return 1
                elif a_num < b_num:
                    return -1
                else:
                    return 0

data = [
    ['19-03-2006', 10000], 
    ['02-09-2006', 68], 
    ['03-07-2006', 300], 
    ['03-07-2006', 80], 
    ['03-07-2006', 200], 
    ['03-07-2006', 30]
]

sorted(data, key=cmp_to_key(comparator))

输出:

[['19-03-2006', 10000],
 ['03-07-2006', 30],
 ['03-07-2006', 80],
 ['03-07-2006', 200],
 ['03-07-2006', 300],
 ['02-09-2006', 68]]

推荐阅读