Сортировка списка по внутренним элементам в Python?

#python #python-3.x #list #sorting

Вопрос:

Как этот список можно отсортировать по элементам внутреннего списка?

 my_list = [[False, 3, 82],[True,15,34], [False,22, 33], [True,2, 5], [False,1,67], [False, 22, 44], [True, 6, 99], [True, 14, 34], [False, 2, 82]]
 

Мне нужен такой список в финале;

 my_list = [[True,2, 5], [True, 2, 99], [True, 14, 34],[True,15,34], [False, 1,67], [False, 2, 82], [False, 3, 44], [False,3, 88], [[False, 22, 44]]
 

Он проверит первые элементы внутренних списков, если есть более одного «Истинного», он проверит и отсортирует вторые элементы. Если есть одинаковые числа, то он проверит третьи элементы.

Ответ №1:

Используйте key параметр sorted :

 import pprint

my_list = [[False, 3, 82], [True, 15, 34], [False, 22, 33],
           [True, 2, 5], [False, 1, 67], [False, 22, 44],
           [True, 6, 99], [True, 14, 34], [False, 2, 82]]


res = sorted(my_list, key=lambda x: (not x[0], x[1], x[2]))
pprint.pprint(res)
 

Выход

 [[True, 2, 5],
 [True, 6, 99],
 [True, 14, 34],
 [True, 15, 34],
 [False, 1, 67],
 [False, 2, 82],
 [False, 3, 82],
 [False, 22, 33],
 [False, 22, 44]]
 

Идея о:

 lambda x: (not x[0], x[1], x[2])
 

состоит в том, чтобы отрицать первый аргумент, чтобы сначала поместить внутренний список True , а затем использовать обычное сравнение int для остальных элементов.

Ответ №2:

Вы можете просто сделать это, трижды отсортировав свой список по ключу, как показано ниже:

  1. Сначала отсортируйте свой список на основе последнего элемента каждого подсписка.
  2. Затем отсортируйте по среднему элементу.
  3. Сортировка по первому элементу и в обратном порядке. Это оно.
     my_list = [[False, 3, 82], [True,15,34], [False,22, 33], [True,2, 5], [False,1,67], [False, 22, 44], [True, 6, 99], [True, 14, 34], [False, 2, 82]]
    my_list.sort(key = lambda x : x[2])
    my_list.sort(key = lambda x : x[1])
    my_list.sort(key = lambda x : x[0], reverse = True)
    print(my_list)
     

Или вы можете использовать однострочный для одной и той же работы:

 my_list.sort(key=lambda x: (not x[0], x[1], x[2]))
 

Преимущество использования sort метода вместо sorted функции заключается в том, что он находится на месте. Это означает, что дополнительная память не требуется.