9

Как отсортировать список/кортеж списков/кортежей по элементу на заданном индексе

13

У меня есть данные, которые представлены в виде списка списков или списка кортежей, например:

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 ответ(ов)

3

Чтобы отсортировать список 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')]

Таким образом вы получите отсортированный список по второму элементу (строке).

0

Для сортировки по нескольким критериям, например, по второму и третьему элементам в 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 функцию для задания приоритетов сортировки по нескольким элементам.

0

Я хотел бы добавить к ответу Стивена: если вы хотите отсортировать массив по убыванию, есть еще один способ, помимо уже упомянутых в комментариях. Просто добавьте следующее в строку:

reverse = True

И результат будет следующим:

data.sort(key=lambda tup: tup[1], reverse=True)
0

Чтобы отсортировать список кортежей (<слово>, <количество>) по количеству в порядке убывания и по слову в алфавитном порядке, вы можете воспользоваться следующим способом:

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, который является лямбда-функцией. Она возвращает кортеж, где первый элемент — это отрицательное значение количества (чтобы отсортировать по убыванию), а второй элемент — это слово (для сортировки по возрастанию). Таким образом, мы получаем желаемый порядок.

0

Для того чтобы выполнить сортировку без использования lambda, можно использовать определённую функцию, которая будет возвращать второй элемент для каждой строки данных. В вашем примере функция sec_elem возвращает второй элемент из переданного объекта. Вот как можно переписать ваш код:

def sec_elem(s):
    return s[1]

sorted_data = sorted(data, key=sec_elem)

В этом коде sorted вызывается с аргументом key, указывающим на функцию sec_elem, которая будет использоваться для извлечения значения, по которому будет происходить сортировка. Таким образом, можно сортировать данные, основываясь на втором элементе каждой сущности, что и требовалось.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь