簡體   English   中英

Python-按多個索引對列表列表進行排序,其中內部列表可能包含“ None”

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

與您所需的輸出相同

除了keysorted函數還允許您通過傳遞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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM