[英]Python- Sorting a list of lists by multiple indices, where inner lists may include “None”
我試圖按內部列表的每個索引對列表列表進行排序。 (所有內部列表的長度都是相同的。)目標是先按最后一列(內部列表的最后一個索引)對行進行排序,然后再按前一列/索引對行進行排序,依此類推。
輸入:
[
['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'
。 有沒有正確的方法來解決這個問題?
使用在您的多維列表上排序
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']]
與您所需的輸出相同
除了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=...)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.