我正在尝试按内部列表的每个索引对列表进行排序。 (所有内部列表的长度都相同。)目标是首先按行排序最后一列(内部列表的最后一个索引),然后按前一列/索引排序等等。
输入:
[
['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'
。有没有正确的方法来处理这个?
答案 0 :(得分: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 :(得分: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=...)