Сортировка списков Python
Выбери формат для чтения
Загружаем конспект в формате pdf
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Объектно-ориентированный анализ
и программирование. Лекция 2019 – 4 .
Сортировка списков
Для сортировки списков в Python применяются:
1) метод sort();
2) функция sorted().
Метод sort()
Данный метод выполняет сортировку «на месте», т.е. с изменением исходного сортируемого списка.
Пример 4-1
b=[5,1,9,0,7]
b.sort()
print(b)
Получим:
[0, 1, 5, 7, 9]
Как видим, по умолчанию сортировка выполняется по возрастанию.
Выполнять сортировку можно также в обратном порядке, в этом случае нужно использовать параметр reverse=True.
Пример 4-2
b=[5,1,9,0,7]
b.sort(reverse=True)
print(b)
Получим
[9, 7, 5, 1, 0]
Аналогичным образом можно сортировать списки, содержащие не числа, а строки.
Пример 4-3
1
Объектно-ориентированный анализ
и программирование. Лекция 2019 – 4 .
s=['Python','C#','Delphi','Java','Pascal']
s.sort()
print(s)
Получим:
['C#', 'Delphi', 'Java', 'Pascal', 'Python']
Если список смешанного типа, то при его сортировке произойдёт ошибка типа (TypeError).
>>>x=[14,'Life',7]
>>>x.sort()
Traceback (most recent call last):
File "", line 1, in
x.sort()
TypeError: '<' not supported between instances of 'str' and 'int
В то же время, вполне можно сортировать список списков (вложенные списки)
Пример 4-4
x = [[6, 5], [8, 9], [2, 3], [4, 3], [4, 0]]
x.sort()
print(x)
Получим
[[2, 3], [4, 0], [4, 3], [6, 5], [8, 9]]
Как видим, сначала сортировка идёт по первому элементу вложенного списка, затем
по второму и т.д.
Также, при сортировке можно собственную ключевую функцию (параметр key), определяющую способ сортировки элементов списка (рассмотрим это позже, когда
научимся определять пользовательские функции).
Функция sorted()
Функция sorted() позволяет сортировать не только списки (как метод sort()), но и любой итерируемый (Iterable) объект.
2
Объектно-ориентированный анализ
и программирование. Лекция 2019 – 4 .
Итерируемый объект – это объект, предоставляющий возможность поочерёдного
прохода по своим элементам.
Кроме того, функция sorted() не меняет исходный объект, а создаёт его копию
>>> x = (4, 3, 1, 2)
>>> y=sorted(x)
>>> y
Получим
[1, 2, 3, 4]
В функции sorted() также может использоваться параметр reverse=True, для получения обратного порядка сортировки.
>>> z = sorted(x, reverse=True)
>>> z
[4, 3, 2, 1]
Функция sorted() также может использовать параметр key для сортировки по ключевой функции.
Оператор проверки принадлежности
in
Оператор in позволяет проверить принадлежность проверяемого элемента списку или
кортежу. Он возвращает логическое значение True (в случае принадлежности элемента) и False (в случае непринадлежности элемента).
Пример 4-5
# 4-5 Проверка принадлежности in
a=[3,8,2,0,5]
# Список
b=(6,5,9,2)
# Кортеж
c=int(input('Введите целое число - '))
if c in a:
print(c,' есть в списке a')
else:
print(c,' НЕТ в списке a')
if c in b:
print(c,' есть в кортеже b')
else:
print(c,' НЕТ в кортеже b')
3
Объектно-ориентированный анализ
и программирование. Лекция 2019 – 4 .
Преобразования между списками и кортежами
Кортежи легко преобразуются в списки функцией list(), также как списки легко преобразуются в кортежи функцией tuple().
Пример 4-6.
a=[6,2,8,5,0]
print(a)
print(type(a))
b=tuple(a)
print(b)
print(type(b))
Получим результат:
[6, 2,
8, 5, 0)
'tuple'>
Упаковка и распаковка кортежей
Упаковку и распаковку кортежа рассмотрим на примере
>>>(a, b, c, d) = (5, 6, 7, 8)
Здесь переменным из левой части оператора присваивания присваиваются значения из
правой части оператора присваивания.
Данная операция равносильна четырём следующим операторам:
>>>a=5
>>>b=6
>>>c=7
>>>d=8
Приведённая операция выполняется с использованием кортежей. Сначала значения из
правой части оператора присваивания упаковываются в кортеж, затем распаковываются в переменные из левой части оператора присваивания.
4
Объектно-ориентированный анализ
и программирование. Лекция 2019 – 4 .
Множества
Множества (set и frozenset)
Множества – это неупорядоченные наборы простых уникальных объектов. Они
необходимы тогда, когда присутствие объекта в наборе важнее порядка или того,
сколько раз данный объект там встречается.
Целые числа, числа с плавающей точкой, строки и кортежи могут быть элементами множества, а списки,
словари и сами множества — нет.
Перечень элементов множества заключается в фигурные скобки.
Используя множества, можно осуществлять все операции над множествами, известными из математики, как то проверку принадлежности, определять, является ли
данное множество подмножеством другого множества, находить пересечения множеств и т.д.
Создание пустого множества
>>> a = set()
>>> a
set()
Создание через литерал (используются фигурные скобки).
>>> a={'a','b','c'}
>>> a
{'a', 'c', 'b'}
5
Объектно-ориентированный анализ
и программирование. Лекция 2019 – 4 .
Создание множества из строки символов
>>> a = set('hello')
>>> a
{'h', 'e', 'o', 'l'}
Такой результат, так как множество неупорядочено и не содержит повторяющихся элементов.
Множества удобно использовать для удаления повторяющихся элементов.
Операции множеств
len(s) - число элементов в множестве (размер множества).
x in s - принадлежит ли x множеству s.
set.isdisjoint(other) - истина, если set и other не имеют общих элементов.
set == other - все элементы set принадлежат other, все элементы other принадлежат
set.
set.issubset(other) или set <= other - все элементы set принадлежат other.
set.issuperset(other) или set >= other - аналогично.
set.union(other, ...) или set | other | ... - объединение нескольких множеств.
set.intersection(other, ...) или set & other & ... - пересечение.
set.difference(other, ...) или set - other - ... - множество из всех элементов set, не принадлежащие ни одному из other.
set.symmetric_difference(other); set ^ other - множество из элементов, встречающихся
в одном множестве, но не встречающиеся в обоих.
set.copy() - копия множества
Операции, изменяющие множество:
set.update(other, ...); set |= other | ... - объединение.
set.intersection_update(other, ...); set &= other & ... - пересечение.
set.difference_update(other, ...); set -= other | ... - вычитание.
6
Объектно-ориентированный анализ
и программирование. Лекция 2019 – 4 .
set.symmetric_difference_update(other); set ^= other - множество из элементов,
встречающихся в одном множестве, но не встречающиеся в обоих.
set.add(elem) - добавляет элемент в множество.
set.remove(elem) - удаляет элемент из множества. KeyError, если такого элемента не существует.
set.discard(elem) - удаляет элемент, если он находится в множестве.
set.pop() - удаляет первый элемент из множества. Так как множества не упорядочены, нельзя точно сказать, какой элемент будет первым.
set.clear() - очистка множества
Фиксированные (замороженные) множества frozenset
frozenset – это замороженное множество, т.е. множества типа set - изменяемый тип
данных, а множества типа frozenset – нет.
Поскольку фиксированные множества обладают свойствами неизменяемости и хешируемости, они могут быть элементами других множеств:
Пример 4-7
# 4-7 Требуется выявить все уникальные буквы,
# которые используются во фрагменте текста
# и отсортировать их по алфавиту.
text="Возможно, завтра пройдет снег с дождем"
print('Текст - ',text)
s=set(text)
print('Множество - ',s)
a=list(s)
print('Список - ',a)
a.sort()
print('Отсортированный Список - ',a)
Допустим, нужно оставить буквы, о специальные символы убрать (пробел, знаки препинания и т.д.). Как это можно сделать с использованием множеств ?
7
Объектно-ориентированный анализ
и программирование. Лекция 2019 – 4 .
Пример 4-8. Убираем спецсимволы из 4-7
Строки
Строки в Python во многом похожи на строки в других языках программирования, поэтому рассмотрим именно те свойства строк, которые характерны именно для
Python.
К символам строк Python можно обращаться по индексам и использовать срезы.
>>> x = "Hello"
>>> x[0]
'H'
>>> x[-1]
'o'
>>> x[1:]
'ello'
К строкам применимы все операции со срезами
С помощью срезов можно отсекать ненужные символы в конце строки
>>> x = "Goodbye\n"
>>> x = x[:-1]
>>> x
'Goodbye'
Длина строки определяется функцией len
>>> len("Goodbye")
7
Что важно, строки не являются списками символов. Главное отличие между строками
и символами заключается в том, что, в отличие от списков, строки не могут изменяться. При попытке использовать выражение вида string.append('c') или string[0] = 'H' произойдет ошибка.
8
Объектно-ориентированный анализ
и программирование. Лекция 2019 – 4 .
x="Goodby"
x[0]= "D"
Traceback (most recent call last):
File "", line 1, in
x[0]='s'
TypeError: 'str' object does not support item assignment
x.append("D")
Traceback (most recent call last):
File "", line 1, in
x.append("D")
AttributeError: 'str' object has no attribute 'append'
Всякий раз, когда мы изменяем строку, на самом деле
создаётся НОВАЯ СТРОКА (точнее новый объект
класса STR).
Данный подход при работе со строками был позаимствован из языка Java.
Основная операция со строками – конкатенация (сцепление, соединение) строк.
>>> a='Доброе'
>>> b=' утро'
>>> a+b
'Доброе утро'
Специальные символы и экранированные последовательности
Существуют комбинации символов, которые не выводят никакой символ, однако они
осуществляют некоторое действие. Также для отображения некоторых символов в
строке нужно задавать их особым образом (предварять символом обратный слэш \).
9
Объектно-ориентированный анализ
и программирование. Лекция 2019 – 4 .
Таблица 4.1. Экранированные последовательности для строковых и байтовых литералов.
Последовательность
Представляемый символ
\'
Одинарная кавычка
\"
Двойная кавычка
\\
Обратный слеш
\a
Звуковой сигнал
\b
Backspace
\f
Прогон страницы
\n
Новая строка
\r
Возврат курсора (не то же,
что \n)
\t
Табуляция
\v
Вертикальная табуляция
Можно включить в строку любой ASCII-символ, указав восьмеричную (основание 8)
или шестнадцатеричную (основание 16) экранированную последовательность, соответствующую этому символу. Восьмеричная экранированная последовательность состоит из обратного слеша, за которым следуют три цифры, определяющие восьмеричное число; восьмеричная последовательность заменяется ASCII-символом, соответствующим этому восьмеричному коду. Шестнадцатеричная экранированная последовательность начинается с \x вместо \ и может содержать произвольное количество
шестнадцатеричных цифр.
10
Объектно-ориентированный анализ
и программирование. Лекция 2019 – 4 .
Например, в таблице ASCII-символов символу m соответствует десятичное значение
109, которое соответствует восьмеричному значению 155 и шестнадцатеричному значению 6D:
>>> 'm'
'm'
>>> '\155'
'm'
>>> '\x6D'
'm'
Поскольку все строки в Python 3 являются строками Юникода, они могут содержать
практически любые символы из любых существующих языков.
>>> '\u0422'
'Т'
>>> '\u0450'
'ѐ'
11