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