Сортировка списков Python с использованием лямбда-функции

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

#python #python-3.x #Список #сортировка #понимание списка

Вопрос:

У меня есть список в виде [[['foo', '$total', 400], ['foo', 'sauce', 300], ['foo', 'bacon', 100]], [['bar', 'bro', 200], ['bar', '$total', -200], ['bar', 'sup', -400]]]

Я хочу применить понимание списка сортировки таким образом, чтобы «$ total» было первым в списке, а остальная часть списка сортировалась в соответствии с третьим элементом в списке.

Пример вывода: [[['foo', '$total', 400], ['foo', 'sauce', 300], ['foo', 'bacon', 100]], [['bar', '$total', -200], ['bar', 'bro', 200], ['bar', 'sup', -400]]]

Здесь «$ total» идет первым по всем вложенным спискам, а остальная часть списка сортируется в обратном порядке по последнему / третьему элементу.

Я пробовал это, но не сработало:

  for index, ele in enumerate(final_res):
    final_res[index] = list(sorted(final_res[index], key=lambda x: [ x[1] if x[1] == "total" else x[2] ], reverse=True))
  

Пожалуйста, дайте мне знать, какой был бы наилучший способ достичь этого с помощью сортировки по пониманию списка.

Ответ №1:

Использование пользовательской функции

Пример:

 data = [[['foo', '$total', 400], ['foo', 'sauce', 300], ['foo', 'bacon', 100]], [['bar', 'bro', 200], ['bar', '$total', -200], ['bar', 'sup', -400]]] 
for i in data:
    i.sort(key=lambda x: (x[1] == '$total', x[2]), reverse=True)
print(data)
#OR data = [sorted(i, key=lambda x: (x[1] == '$total', x[2]), reverse=True) for i in data]
  

Вывод:

 [[['foo', '$total', 400], ['foo', 'sauce', 300], ['foo', 'bacon', 100]],
 [['bar', '$total', -200], ['bar', 'bro', 200], ['bar', 'sup', -400]]]