2017-10-19 54 views
0

我試圖按內部列表的每個索引對列表進行排序。 (所有內部列表的長度都是相同的。)目標是先按最後一列(內部列表的最後一個索引)排序行,然後再按前一列/索引依次排序。Python-按多個索引對列表進行排序,其中內部列表可能包含「無」

輸入:

[ 
    ['2016', 'E', None, '68', '94'], 
    ['2016', 'A', None, '91', '25'], 
    ['2016', 'C', None, '74', '25'], 
    ['2017', 'C', None, '55', '20'], 
    ['2015', 'D', None, '20', '14'], 
    ['2016', 'B', None, '66', '66'], 
    ['2017', 'E', None, '29', '41'], 
    ['2017', 'F', None, '61', '22'], 
    ['2015', 'A', None, '17', '96'] 
] 

輸出:

[ 
    ['2015', 'A', None, '17', '96'], 
    ['2015', 'D', None, '20', '14'], 
    ['2016', 'A', None, '91', '25'], 
    ['2016', 'B', None, '66', '66'], 
    ['2016', 'C', None, '74', '25'], 
    ['2016', 'E', None, '68', '94'], 
    ['2017', 'C', None, '55', '20'], 
    ['2017', 'E', None, '29', '41'], 
    ['2017', 'F', None, '61', '22'] 
] 

,我有以下的代碼,我試圖用這個:

def sort_table(column_count, rows) 
    for i in range(len(column_count) - 1, -1, -1): 
    rows = sorted(rows, key=operator.itemgetter(i)) 
    return rows 

然而,似乎由列表中存在或可能存在None值的事實拋出。我不斷收到錯誤TypeError: '<' not supported between instances of 'NoneType' and 'str'。有沒有正確的方法來處理這個問題?

+1

https://stackoverflow.com/questions/12971631/sorting-list-by-an-attribute-that-c​​an-be-none – Rockybilly

+1

只需使用[ 'sorted'](https://docs.python.org/dev/library/functions.html#sorted) –

+0

@PatrickHaugh - 我正在使用排序。我應該做什麼不同? – ebbishop

回答

3

使用排序的多維名單上

l = [ 
    ['2016', 'E', None, '68', '94'], 
    ['2016', 'A', None, '91', '25'], 
    ['2016', 'C', None, '74', '25'], 
    ['2017', 'C', None, '55', '20'], 
    ['2015', 'D', None, '20', '14'], 
    ['2016', 'B', None, '66', '66'], 
    ['2017', 'E', None, '29', '41'], 
    ['2017', 'F', None, '61', '22'], 
    ['2015', 'A', None, '17', '96'] 
] 
print(sorted(l)) 

打印

[['2015', 'A', None, '17', '96'], ['2015', 'D', None, '20', '14'], ['2016', 'A', None, '91', '25'], ['2016', 'B', None, '66', '66'], ['2016', 'C', None, '74', '25'], ['2016', 'E', None, '68', '94'], ['2017', 'C', None, '55', '20'], ['2017', 'E', None, '29', '41'], ['2017', 'F', None, '61', '22']] 

這是一樣的你需要的輸出

+1

或者,如果你確實希望由最後一個索引完成排序(如描述中所示,但不是樣例輸出),請使用'sorted(l,key = reversed)' – Holloway

+0

@Hloloway這不是我想按照與我在結果中顯示的那個,只不過我需要分別對每個索引進行排序,所以我正在通過索引反向工作,以獲得期望的效果。 – ebbishop

1
key

除此之外,該sorted功能還允許您自定義比較函數,通過傳遞一個cmp參數。只需傳遞兩個參數的函數,如果第一個參數較小,則返回負值,如果較大則返回正數,如果相等則返回零。這取決於你想要什麼,你可以不喜歡

import numpy as np 

def mycomparator(a, b): 
    if a is None: 
     return -1 
    return np.sign(a - b) 

sorted(..., cmp=mycomparator, key=...) 
+0

感謝關於'cmp'參數 – ebbishop

+1

@ebbishop的提示,請記住在Python 3中刪除了'cmp'關鍵字。 – Holloway

相關問題