Python-按多个索引对列表进行排序,其中内部列表可能包含“无”

时间:2017-10-19 17:36:53

标签: python list sorting

我正在尝试按内部列表的每个索引对列表进行排序。 (所有内部列表的长度都相同。)目标是首先按行排序最后一列(内部列表的最后一个索引),然后按前一列/索引排序等等。

输入:

[
  ['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'。有没有正确的方法来处理这个?

2 个答案:

答案 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=...)