Перейти к содержимому

Python как отсортировать tuple

  • автор:

Сортировка списка кортежей по n-му элементу в Python

В этом посте мы обсудим, как отсортировать список кортежей по n-му элементу в Python.

1. Использование list.sort() функция

Pythonic-решение для на месте отсортировать список кортежей, чтобы использовать list.sort() функция, которая может принимать два аргумента, состоящих только из ключевых слов: ключ а также задний ход. В следующем примере показано, как отсортировать список кортежей с некоторыми элементами, отсортированными в обратном порядке.

Сортировка списка кортежей по двум параметрам

Нужно отсортировать кортеж сразу по двум параметрам, сортировка 0 элемента по алфавиту и сортировка 1 элемента по убыванию числа. То есть на выходе должен получиться кортеж:

[('AA', 100), ('AB', 100), ('AB', 80), ('BAA', 80), ('A', 50)] 

Сортировка такого типа, не даёт нужный мне результат:

s = [('AB', 80), ('BAA', 80), ('AA', 100), ('AB', 100), ('A', 50)] s.sort(key=lambda x: (x[1], x[0]), reverse=True) 
[('AB', 100), ('AA', 100), ('BAA', 80), ('AB', 80), ('A', 50)] 

Отслеживать
149k 12 12 золотых знаков 59 59 серебряных знаков 132 132 бронзовых знака
задан 2 фев 2021 в 11:36
15 4 4 бронзовых знака

у вас немного странное представление о сортировке по алфавиту — почему вы ожидаете, что ‘A’ в отсортированном списке будет стоять в самом конце?

2 фев 2021 в 11:46
@MaxU возможно, имеется ввиду сортировка по убыванию числа, а среди совпадающих — по алфавиту строки
2 фев 2021 в 11:56
@MaxU нужна сортировка и по алфавиту и по убыванию числа. В вопросе я это написал.
2 фев 2021 в 12:01

@Jack_oS, похоже на то. Хотя судя по формулировке — сортировка 0 элемента по алфавиту и сортировка 1 элемента по убыванию числа должно быть наоборот. Мы все-таки читаем слева-направо 😉

2 фев 2021 в 12:08

@Максим смените тональность: никто здесь, думаю, не подписывал с вами контракт на выполенение заданий, тем более поданых с двусмысленной формулировкой

2 фев 2021 в 12:12

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Решение для сформулированного вопроса:

data = [('AB', 80), ('BAA', 80), ('AA', 100), ('AB', 100), ('A', 50)] res = sorted(data, key=lambda x: (x[0], -x[1])) 
In [158]: res Out[158]: [('A', 50), ('AA', 100), ('AB', 100), ('AB', 80), ('BAA', 80)] 

Решение для ожидаемого результата (в данном случае сначала сортируем кортежи по второму элементу по убыванию, а уже потом для совпадающих вторых элементов, сортируем по алфавиту первые элементы):

res2 = sorted(data, key=lambda x: (-x[1], x[0])) In [164]: res2 Out[164]: [('AA', 100), ('AB', 100), ('AB', 80), ('BAA', 80), ('A', 50)] 

NOTE: попробуйте внятно сформулировать вопрос — порядок имеет значение!

Сортировка кортежей в порядке возрастания по любому ключу на Python

С учетом кортежа наша задача состоит в том, чтобы отсортировать список кортежей в порядке возрастания по любому ключу в кортеже. Нам нужно отсортировать их в соответствии с любым заданным ключом.

Для этого мы используем функцию sorted(), где мы сортируем их, используя key = last, и сохраняем last в качестве индекса ключа, в соответствии с которым мы должны отсортировать указанные кортежи на Python.

Пример

Input: A = [(2, 55), (1, 20), (4, 40), (2, 30)] k = 0 Output: [(1, 20), (2, 30), (2, 55), (4, 40)]

Увеличение порядка сортировки с помощью 0-го индексного ключа.

Алгоритм

Step 1: get the last key value. Step 2: next we use inbuilt function sorted() method where we sort them using key=last and store last as the key index according to which we have to sort the given tuples. Step 3: display sorted list.

Пример кода

# Python program to sort a list of tuples # in increasing order by any key # get the last key. def data(n): return n[k] # function to sort the tuple def tuplesort(tup): # We pass used defined function last # As a parameter. return sorted(tup, key = data) # Driver code a = [(230, 456, 120), (205, 414, 39), (89, 410, 213)] k = int(input("Enter the Index ::>")) print("Sorted:"), print(tuplesort(a))

Вывод

Enter the Index ::>2 Sorted: [(205, 414, 39), (230, 456, 120), (89, 410, 213)]

Python кортеж

Чтобы усовершенствовать программный код, добавить в него новые важные функции используются разнообразные методы. К ним относится: создание списков, кортежей или словарей. В данной статье рассмотрим, когда используются, чем они отличаются, как создать и как работать с кортежами в Python 3.

Что такое кортеж

Кортеж – это неизменная структура заданных заранее значений. Он очень похож на список, но последний подвержен изменениям. Так, если нужно исправить какой-то элемент списка, можно сделать это, напрямую указав:

b = [4, 6, 8] print(b) [4, 6, 8] b[1] = 13 print(b) [4, 13, 8]

Если же записать подобный код, но попытаться применить его к кортежу, ничего не выйдет, а на экране появится надпись об ошибке. Считается, что это важно, поскольку таким образом данные невозможно будет изменить как случайно, так и намеренно. Также в python добавление элемента в кортеж невозможно. Правда можно привести его в список, добавить элемент. После этого полученный список преобразовать обратно.

Выгодное преимущество кортежа состоит также в том, что он имеет меньший размер, что проверяется применением команды sizeof. Она показывает, сколько занимает объект в байтах:

a = (2, 4, 6, 8, 10, 12) b = [2, 4, 6, 8, 10, 12] a.__sizeof__() 36 b.__sizeof__() 44

Из этого кода видно, что кортеж (в круглых скобках) занимает 36 байтов, а список (в квадратных скобках) – 44 байта.

Создание

Кортеж определяется точно так же, как и список, однако перечисление происходит в круглых, а не квадратных скобках. Элементы будут стоять в определенном порядке, а их нумерация всегда начинается с нуля. А точнее для непустого кортежа первым элементом будет являться ноль. Отрицательный индекс позволит отсчитывать все с конца (с правой стороны).

Приведем пример создания в Python обычного кортежа:

a = (1,2,3)

Можно преобразовать список в кортеж следующим образом:

a = tuple([1,2,3])

Рассмотрим кортеж с отрицательным индексом:

n = ("a", "b", "с", "d", "e") print(n[-1]) 'e'

То есть на экране отобразился первый не с начала, а с конца элемент.

Чтобы создать кортеж с одним элементом, нужно сделать такую запись:

a =(3,) print(a[0]) 3

Нужно обратить особое внимание на то, что даже если элемент один, после него все равно должна стоять запятая.

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

a = tuple(i for i in range(0, 10)) print(a) (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

Выше представлен генератор кортежа. То есть мы создали генератор. После этого преобразовали его к кортежу с помощью ключевого слова tuple.

Помните, что к генератору нельзя применить срезы. Если потребуется — то можно привести генератор к кортежу и только потом сделать срез.

Подробнее о срезах описано ниже в пункте «Обращение к элементу».

Использование генераторов кортежей аналогично генераторам списка.

Обращение к элементу

У каждого элемента есть свой индекс. То есть, в Python для обращения к элементу кортежа, нужно просто указать его индекс. Напомним, что счет начинается с нуля. Посмотрим на код:

b = (4, 6, 8) print(b[0]) print(b[1]) 4 6

Из кортежа можно извлечь как элемент, так и срез. В этом случае мы получим кортеж, состоящий из элементов, расположенных в промежутке среза. Следует уточнить, что при указании среза используются не номера элементов, а номера промежутков между ними. Перед первым элементом находится промежуток с индексом 0. Рассмотрим пример:

b = (5, 3.6, "квадрат", 15, 'В') print(b[1]) print(b[2:4]) 3.6 ('квадрат', 15)

Методы

Кортежи в python имеют только два метода: index() и count(). Первый применяется, чтобы узнать, какой индекс у определенного элемента. Например:

a = (32, 33, 34, 33, 34, 33) print(a.index(33)) 1

Элементов «33» в кортеже несколько, но на экран будет выведен индекс первого из них.

Метод count используется, если нужно узнать, сколько определенных элементов имеется в кортеже.

a = (32, 33, 34, 33, 34, 33) print(a.count(33)) 3

На экране перед пользователем появится именно число 3, потому что в кортеже искомое число 33 повторяется 3 раза.

Помните, что в кортежах нет методов добавления и удаления элементов.

Именованные кортежи

Данный класс не получил широкого применения среди программистов, хотя он и является достаточно важным и полезным. Именованные кортежи в python (или namedtuple) в каком-то смысле являются расширениями для обычных. Так, огромной проблемой считается то, что получать данные из кортежа можно только при помощи числовых индексов. А что делать, если хочется для наглядности кода обращаться к элементам, используя строковое наименование. Такое обращение значительно улучшит читаемость кода. Для этого на помощь приходит namedtuple.

Для того, чтобы использовать namedtuple, необходимо подключить библиотеку collections. Это делается с помощью import collecions * . В этом случае обращаться к namedtuple будет необходимо следующим образом: collections.namedtuple( [параметры] ) . Другой вариант подключения библиотеки приведен в примере ниже.

Каждый элемент, сохраненный в именованном кортеже, доступен через определенный идентификатор. Посмотрим на примере кода:

from collections import namedtuple Flower = namedtuple('Flower' , 'color cost comment') rose = Flower('red', 5, 'beautiful') print(rose.cost) 5

Наименования полей были перечислены через пробел. Вместо этой строки можно было передать список со строками. В конструкторе namedtuple разобьет полученную строку с помощью split. В качестве примера было приведено обращение к элементу cost. К остальным обращение аналогично: rose.color , rose.comment .

Таким образом, именованный кортеж делает вид программного кода более читаемым. Так, в вышеуказанном коде можно увидеть наименования color, cost и comment. И при всем при этом, сохраняется возможность обращения к элементам по индексу, например дописав к предыдущему коду:

print(rose[0]) red

Список кортежей

Иногда бывают задачи, в которых нужно хранить таблицы с данными, которые называются матрицами (или двумерными массивами). Для работы с массивами используется библиотека array. К сожалению, не получится с ее помощью сделать массив кортежей. Потому что элементом массива не может быть кортеж.

Из этой ситуации есть выход — создание в Python списка кортежей. Вариант объявления такого списка представлен ниже:

a = [(1,2,3),(4,5,6)]

Cортировка

Иногда нужно отсортировать имеющиеся элементы списка. Благодаря встроенной функции sorted, все это делается достаточно легко:

a = ('One', 'Two', 'Three') a = tuple(sorted(a)) print(a) ('One', 'Three', 'Two')

Видно, что произошла сортировка кортежа Python по алфавиту. Стандартную сортировку можно провести и по числовым элементом. Посмотрим на пример:

a = (3, 1, 5 ,2, 6, 7) a = tuple(sorted(a)) print(a) (1, 2, 3, 5, 6, 7)

Заметим, что произошла сортировка по возрастанию.

Обратите внимание, что функция sorted возвращает список, но с помощью tuple мы приводим результат сортировки к кортежу.

В список

Кортеж можно переделать в список:

a = (1,2,3) a = list(a) print(a) [1, 2, 3]

Таким образом, кортеж был преобразован в список Python, который можно изменить. Теперь рассмотрим обратное действие — преобразование списка в кортеж:

a = [1, 2.6, "квадрат"] a = tuple(a) print(a) (1, 2.6, "квадрат")

В словарь

Словарь – это еще одна структура используемая в Python. Он, как и список, является изменяемым, но при этом неупорядоченным. Это значит, что обратиться к определенному элементу посредством указания индекса – не получится. Чтобы лучше понять, можно провести аналогию с обычным англо-русским словарем. В нем для каждого слова есть перевод: house –дом, flat – квартира, window – окно. Если перенести такую структуру в программный код, то получится такая запись, оформляемая фигурными скобками:

Последовательность пар при выводе на экран не определяется никаким правилом, отображаются они в произвольном порядке.

Для того, чтобы в Python преобразовать кортеж в словарь, необходимо использовать приведение типов с помощью dict.

a = ((‘a’, 2),(‘b’, 4)) a = dict(a) print(a)

Как видно, для создания словаря понадобился кортеж кортежей. Причем вложенные кортежи состоят из двух элементов каждый. Иначе не получается провести преобразование к словарю.

В строку

Чтобы вывести в python кортеж в одну строку, используется функция join. Посмотрим на примере:

a = ('one','two','three') b = ''.join(a) c = ','.join(a) print(b) print(c) onetwothree one,two,three

После выполнения кода на дисплее появится запись всех элементов в одну строку с указанным разделителем. В первом случае — без пробелов, а во втором случае — через запятую.

Чем же кортежи удобнее? Работа с ними проходит быстрее, чем, например, со списками. Если программисту нужно определить постоянный набор значений, чтобы затем их перебирать, то лучше будет сделать это с его помощью. Плюс – это экономия оперативной памяти, так как они занимают меньше места, чем списки.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *