Как отсортировать список/кортеж списков/кортежей по элементу на заданном индексе
У меня есть данные, которые представлены в виде списка списков или списка кортежей, например:
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?
В чем разница между списками и кортежами?
Как отсортировать список объектов по атрибуту объектов?
Как клонировать список, чтобы он не изменялся неожиданно после присваивания?
Как изменить порядок столбцов в DataFrame?