Python: Перемещение определенных списков внутри списка на основе элемента в конце

#python #list #sorting

Вопрос:

У меня есть список, который содержит другие списки. Каждый элемент этого списка содержит 5 элементов, примерно так:

 requests = [['abc', 'def', 'abc.def@email.com', 'GROUP1', '000'],
           ['ghi', 'jkl', 'ghi,jkl@email.com', 'GROUP4', '111'],
           ['mno', 'pqr', 'mno.pqr@email.com', 'GROUP4', '222'],
           ['stu', 'vxy', 'stu.vxy@email.com', 'GROUP2', '333'],
           ['123', '456', '123.456@email.com', 'GROUP4', '444'],
           ['A12', 'B34', 'A12.B34f@email.com', 'GROUP3', '555']]
 

Я хотел бы отсортировать этот список таким образом, чтобы каждый список, содержащий элемент, равный GROUP4, был помещен в конец списка. Итак, результат будет выглядеть следующим образом:

 requests = [['abc', 'def', 'abc.def@email.com', 'GROUP1', '000'],
           ['stu', 'vxy', 'stu.vxy@email.com', 'GROUP2', '333'],
           ['A12', 'B34', 'A12.B34f@email.com', 'GROUP3', '555'],
           ['ghi', 'jkl', 'ghi,jkl@email.com', 'GROUP4', '111'],
           ['mno', 'pqr', 'mno.pqr@email.com', 'GROUP4', '222'],
           ['123', '456', '123.456@email.com', 'GROUP4', '444'],]
 

Мне удалось отсортировать их на основе этого конкретного элемента, используя:

 requests.sort(key=lambda x: x[3])
 

Но это просто сортирует их в алфавитном порядке, основываясь на 4-м элементе. Это не сработает, если присутствует ГРУППА 5 или ГРУППА 6, так как эти 2 будут последними элементами.

Есть какие-нибудь идеи о том, как это сделать?

Большое спасибо!

Комментарии:

1. Попробуйте это простое изменение — requests.sort(key=lambda x: x[3] == "GROUP4") используйте трюк True , когда 3-й элемент GROUP4

Ответ №1:

Вы можете изменить lambda , чтобы проверить, является ли 4-й элемент 'GROUP4'

 requests.sort(key=lambda x: x[3] == 'GROUP4')
 

Если вы хотите отсортировать остальную часть списка, а также использовать tuple в lambda двух элементах, он будет отсортирован 'GROUP4' сначала по порядку, а затем по лексикографии

 requests.sort(key=lambda x: (x[3] == 'GROUP4', x[3]))
 

Ответ №2:

Переместите списки с группой 4 по индексу [3] в конец путем сортировки по логическому значению.

 requests.sort(key=lambda el: el[3] == "GROUP4")
 

Комментарии:

1. Я думаю, вы могли бы уточнить свой ответ, указав, что .sort гарантированно будет стабильная сортировка, что в данном случае означает, что ваш фрагмент кода будет перемещать "GROUP4" элементы только в конец списка, без каких-либо других изменений порядка элементов.