Python通过多个索引对列表进行排序,其中内部列表可能包含“None”

2024-03-29 08:12:20 发布

您现在位置: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'。有没有正确的方法来处理这个问题?你知道吗


Tags: 代码innone目标列表forlen排序
2条回答

除了keysorted函数还允许您通过传递cmp参数来自定义comparator函数。只需传递一个包含两个参数的函数,如果第一个参数较小,则返回负值;如果第一个参数较大,则返回正值;如果两个参数相等,则返回零。取决于你想要什么,你可以做一些

 import numpy as np

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

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

在多维列表中使用排序

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']]

与您所需的输出相同

相关问题 更多 >