[Python] 有一堆dict的資料,如何依序多個Key排序?

有一群資料要做排序,而且要根據不同欄位先後做排序,如同下圖EXCEL的功能

參考來源 : http://stackoverflow.com/questions/1143671/python-sorting-list-of-dictionaries-by-multiple-keys

先轉換原始資料變成Python的資料

lst = []
lst.append({'Name':'Bob','Chinese':50,'Math':50,'English':43,'Sport':74} )
lst.append({'Name':'Dora','Chinese':50,'Math':50,'English':50,'Sport':69} )
lst.append({'Name':'Alvin','Chinese':50,'Math':50,'English':50,'Sport':50})
lst.append({'Name':'Eva','Chinese':50,'Math':50,'English':50,'Sport':60})
lst.append({'Name':'Chris','Chinese':80,'Math':44,'English':57,'Sport':48})
資料如下:
[{'Chinese': 50, 'English': 43, 'Math': 50, 'Name': 'Bob', 'Sport': 74},
 {'Chinese': 50, 'English': 50, 'Math': 50, 'Name': 'Dora', 'Sport': 69},
 {'Chinese': 50, 'English': 50, 'Math': 50, 'Name': 'Alvin', 'Sport': 50},
 {'Chinese': 50, 'English': 50, 'Math': 50, 'Name': 'Eva', 'Sport': 60},
 {'Chinese': 80, 'English': 57, 'Math': 44, 'Name': 'Chris', 'Sport': 48}]

排序function如下:

def multikeysort(items, columns):
    from operator import itemgetter
    comparers = [((itemgetter(col[1:].strip()), -1) if col.startswith('-') else
                  (itemgetter(col.strip()), 1)) for col in columns]
    def comparer(left, right):
        for fn, mult in comparers:
            result = cmp(fn(left), fn(right))
            if result:
                return mult * result
        else:
            return 0
    return sorted(items, cmp=comparer)

針對lst多項順序性排序:  預設是升冪排序(小到大) ,欄位多個 '-' 表示降冪排序(大到小)

sorted_lst = multikeysort(lst, ['-Chinese','-Math','-English','Sport'])
[{'Chinese': 80, 'English': 57, 'Math': 44, 'Name': 'Chris', 'Sport': 48},
 {'Chinese': 50, 'English': 50, 'Math': 50, 'Name': 'Alvin', 'Sport': 50},
 {'Chinese': 50, 'English': 50, 'Math': 50, 'Name': 'Eva', 'Sport': 60},
 {'Chinese': 50, 'English': 50, 'Math': 50, 'Name': 'Dora', 'Sport': 69},
 {'Chinese': 50, 'English': 43, 'Math': 50, 'Name': 'Bob', 'Sport': 74}]