Как отсортировать список/кортеж списков/кортежей по элементу на заданном индексе
У меня есть данные, которые представлены в виде списка списков или списка кортежей, например:
data = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
data = [(1, 2, 3), (4, 5, 6), (7, 8, 9)]
Мне нужно отсортировать их по второму элементу в каждом подмножестве. То есть я хочу отсортировать по 2, 5, 8, где 2 — это элемент из (1, 2, 3), 5 — из (4, 5, 6) и так далее. Каков общий способ сделать это? Должен ли я хранить кортежи или списки в своем списке?
5 ответ(ов)
Чтобы отсортировать список data по второму элементу каждого элемента (предположим, что это список списков или кортежей), вы можете использовать функцию sort() вместе с itemgetter из модуля operator. Вот пример кода:
from operator import itemgetter
data.sort(key=itemgetter(1))
В этом примере data сортируется на месте по второму элементу каждого вложенного элемента (индекс 1). Это удобно, если у вас есть список, где каждый элемент является коллекцией (например, списком или кортежем) и вы хотите сортировать его по конкретному полю.
Если ваш data выглядит, например, так:
data = [(1, 'apple'), (2, 'banana'), (3, 'cherry')]
После выполнения data.sort(key=itemgetter(1)) ваш список будет выглядеть как:
[(1, 'apple'), (3, 'cherry'), (2, 'banana')]
Таким образом вы получите отсортированный список по второму элементу (строке).
Для сортировки по нескольким критериям, например, по второму и третьему элементам в tuple, можно воспользоваться следующим примером:
У нас есть такой список кортежей:
data = [(1, 2, 3), (1, 2, 1), (1, 1, 4)]
Чтобы отсортировать этот список по второму и третьему элементам кортежей, мы можем определить lambda, которая будет возвращать кортеж, описывающий порядок при сортировке. Например, это можно сделать так:
sorted_data = sorted(data, key=lambda tup: (tup[1], tup[2]))
После выполнения этой команды, список будет отсортирован и выведется в следующем порядке:
[(1, 1, 4), (1, 2, 1), (1, 2, 3)]
Таким образом, вы можете использовать lambda функцию для задания приоритетов сортировки по нескольким элементам.
Я хотел бы добавить к ответу Стивена: если вы хотите отсортировать массив по убыванию, есть еще один способ, помимо уже упомянутых в комментариях. Просто добавьте следующее в строку:
reverse = True
И результат будет следующим:
data.sort(key=lambda tup: tup[1], reverse=True)
Чтобы отсортировать список кортежей (<слово>, <количество>) по количеству в порядке убывания и по слову в алфавитном порядке, вы можете воспользоваться следующим способом:
data = [
('betty', 1),
('bought', 1),
('a', 1),
('bit', 1),
('of', 1),
('butter', 2),
('but', 1),
('the', 1),
('was', 1),
('bitter', 1)]
Я использую следующий код для сортировки:
sorted(data, key=lambda tup: (-tup[1], tup[0]))
Это дает мне следующий результат:
[('butter', 2),
('a', 1),
('betty', 1),
('bit', 1),
('bitter', 1),
('bought', 1),
('but', 1),
('of', 1),
('the', 1),
('was', 1)]
Здесь мы передаем в функцию sorted параметр key, который является лямбда-функцией. Она возвращает кортеж, где первый элемент — это отрицательное значение количества (чтобы отсортировать по убыванию), а второй элемент — это слово (для сортировки по возрастанию). Таким образом, мы получаем желаемый порядок.
Для того чтобы выполнить сортировку без использования lambda, можно использовать определённую функцию, которая будет возвращать второй элемент для каждой строки данных. В вашем примере функция sec_elem возвращает второй элемент из переданного объекта. Вот как можно переписать ваш код:
def sec_elem(s):
return s[1]
sorted_data = sorted(data, key=sec_elem)
В этом коде sorted вызывается с аргументом key, указывающим на функцию sec_elem, которая будет использоваться для извлечения значения, по которому будет происходить сортировка. Таким образом, можно сортировать данные, основываясь на втором элементе каждой сущности, что и требовалось.
Как отсортировать список словарей по значению словаря в Python?
В чем разница между списками и кортежами?
Сортировка списка в соответствии с соответствующими значениями из параллельного списка
Список vs кортеж: когда использовать каждый?
Сортировка списка кортежей по второму элементу (целое значение)