Внимание! На этой странице вы найдете материал урока из архивного курса по Python. Курс был написан в 2024 году и по-прежнему актуален для начинающих разработчиков.
Теоретический материал сохранен в исходном виде, а практические задания с автоматической проверкой вынесены в отдельные интенсивы и задания.
Полный список уроков доступен по тегу Архивный курс по Python и на странице первого урока.
Списки:
- Урок 18. Списки в Python
- Урок 19. Изменение списка на месте (срезы) в Python
- Урок 20. Дополнительно про списки в Python
- Урок 21. Конкатенация и сортировка списков в Python
Словари:
- Урок 22. Словари в Python
- Урок 23. Словари и списки (дополнительно)
- Урок 24. Перебор элементов словаря в Python
- Урок 25. Внутреннее устройство и сортировка словаря в Python
- Урок 26. Методы словарей и функция len() в Python
Множества:
- Урок 27. Множества в Python
- Урок 28. Методы и особенности множеств в Python
- Урок 29. Отношения между множествами и операции над ними
Кортежи:
- Раздел "Структуры данных в Python" охватывает списки, словари, множества и кортежи.
- Списки: основные методы работы со списками, универсальные функции
sum(),min()иmax(), срезы (slice) для изменения списков на месте. - Словари: метод
setdefault(), перебор элементов словаря с помощью циклаfor, методыitems(),keys()иvalues(), внутреннее устройство словаря и его сортировка. - Множества: создание множеств, методы
add(),remove(),discard(),pop()иclear(), проверка наличия элемента во множестве. - Кортежи: определение кортежей, методы распаковки, неизменяемость кортежей.
- В разделе также рассмотрены особенности хранения элементов словаря в памяти и сортировка словаря по ключам и значениям.
- Раздел "Структуры данных в Python" является объемным и затрагивает важные базовые темы, которые помогут разобраться с более сложным материалом.
В этом разделе подробно рассмотрели четыре структуры данных: списки, словари, множества и кортежи.
Краткий пересказ раздела «Структуры данных в Python»
Списки
Первый урок начали с нескольких примеров списков:
list1 = [2, 4, 8, 16]
list2 = ["Иван", "Иванов", 20]
list3 = [list1, list2]
list3 = [[2, 4, 8, 16], ["Иван", "Петр"]]
И написали программу, которая выводит гласные, встречающиеся в строке:
letters = ["а", "е", "и", "о", "у", "э", "ю", "я"]
word = "список – это массив"
for item in word:
if item in letters:
print(item)
Далее пробежались по основным методам, работающим со списками: append, pop, extend, remove и insert. Позднее изучили и другие: index, clear, reverse, count. Познакомились с универсальными функциями sum(), min() и max(). Вспомнили про модуль random и перемешали элементы списка с помощью метода snuffle():
import random
a = [1, "Hello", [3, 6, 7], 4, 5]
random.shuffle(a) # ~=> [5, 'Hello', 4, 1, [3, 6, 7]]
Изучая списки, мы затронули срезы (slice), которые помогают изменять их на месте:
a = [1, 2, 3, 4, 5]
a[1:3] # => [2, 3]
a[1:] # => [2, 3, 4, 5]
a[1:] = [6, 7] # => [1, 6, 7]
В конце выяснили как правильно «соединять» (конкатенировать) списки и с какими неожиданными эффектами можно столкнуться при их копировании. В этом же уроке познакомились с функцией sorted() и методом sort(), с помощью которых можно сортировать списки.
Словари
Словари в Python напоминают ассоциативные массивы. В них так же уникальному значению ключа соответствует произвольное значение. Словарь в Python объявляется в фигурных скобках:
person = {"firstname": "Ivan",
"lastname": "Ivanov",
"age": 30}
print(person["firstname"])
В этом же уроке мы познакомились с методом setdefault(), который упрощает наш код.
for letter in word:
letters.setdefault(letter, 0)
letters[letter] += 1
Затем мы разобрались как можно перебирать элементы словаря. Это делается не так просто как со списками. Использовали всё тот же цикл for:
numbers = {1: 'One', 2: 'Two', 3: 'Three', 4: 'Four'}
for item in numbers:
print(item, numbers[item])
Далее рассмотрели методы items(), keys() и values(). Метод items() возвращает список кортежей из двух элементов. Методы keys() и values() возвращают список ключей и список значений, соответственно:
print(numbers.items()) # => dict_items([(1, 'One'), (2, 'Two'), (3, 'Three'), (4, 'Four')])
print(numbers.keys()) # => dict_keys([1, 2, 3, 4])
print(numbers.values()) # => dict_values(['One', 'Two', 'Three', 'Four'])
Вооружившись новыми методами, переписали пример выше:
numbers = {1: 'One', 2: 'Two', 3: 'Three', 4: 'Four'}
for k, v in numbers.items():
print(k, v)
В следующем уроке очень подробно разобрали внутреннее устройство словаря и то, как он хранится в памяти. Далее поговорили о его сортировке.
Далее познакомились со следующими методами словарей: pop(), get(), popitem(), clear(), copy(), fromkeys() и update(). Изучили универсальную функцию len() и ключевое слово del.
Множества
В Python множество – структура данных, которая очень похожа на множества из школьной математики. Главная особенность множества – автоматическое удаление одинаковых значений. Как в строке оставить только уникальные символы? Очень просто:
letters = set("ааоеее")
print(letters) # => {'а', 'о', 'е'}
В следующем уроке мы выяснили как создаются множества и познакомились с различными методами: add(), remove(), discard(), pop() и clear(). Научились проверять наличие элемента во множестве:
s = {1, 1, 2, 2, 3}
print(1 in s) # => True
Кстати, проверка выполняется очень быстро, так как множества основаны на хэш-таблицах.

Далее мы говорили об отношениях между множествами и методах issubset(), issuperset(), update(), intersection(), intersection_update(), difference(), difference_update(), symmetric_difference(), symmetric_difference_update(). Урок очень подробный и наглядный, поэтому рекомендую к нему вернуться. Там же немного поговорили о структуре frozenset.
Кортежи
После изучения списков, множеств и словарей, о кортежах мало что можно сказать. Кортежи – неизменяемая структура. Начали мы с определения кортежей в коде. Их выдают круглые скобки. Нужно быть только внимательными с кортежами из одного элемента: интерпретатор может принять их за другой объект:
c = ("Строка")
print(type(c)) # => <class 'str'>
c = ("Строка", )
print(type(c)) # => <class 'tuple'>
Если забыли про функцию type(), вернитесь к уроку про преобразование и проверку типов в Python.
В следующем уроке поговорили подробнее о кортежах и их вездесущности. Так же затронули оператор распаковки (*).
Еще говорили о неизменяемости кортежей. В этой фразе тоже есть нюанс, например:
t = (1, 2, [3, 4], 5)
t[2][1] = 6
print(t) # => (1, 2, [3, 6], 5)
У нас получилось изменить элемент кортежа. Это важный момент в понимании «неизменяемости» кортежа. Кортежи хранят ссылки на элементы (которые, в свою очередь, могут быть как изменяемые, так и не изменяемые).
Новая информация из раздела «Структуры данных в Python»
Списки
Пустой список в Python создается достаточно просто: [] или list():
list1 = []
list2 = list()
Списки имеют следующие основные методы:
append()- добавление элемента в конец списка.remove()- удаление элемента по значению.pop()- удаляет элемент по индексу и возвращает его.extend()- добавление списка в конец списка.insert()- вставка элементов в определенную позицию в списке.index()- определение индекса элемента по значению.clear()- полностью очистить список.reverse()- изменить порядок элементов на обратный.count()- посчитать сколько раз встречается элемент в списке.
На примере работа методов списков будет понятнее:
list1 = []
list1.append(1)
list1.append("a")
list1 # => [1, 'a']
list1.remove(1)
list1 # => ['a']
list1.extend([1, 2, 3])
list1 # => ['a', 1, 2, 3]
list1.insert(2, 'a'
list1 # => ['a', 1, 'a', 2, 3]
list1.index(2) # => 3
list1.count('a') # => 2
list1.reverse()
list1 # => [3, 2, 'a', 1, 'a']
list1.clear()
list1 # => []
Теперь вспомним как изменять списки на месте (то есть использовать срезы). Напомню, списки являются изменяемой структурой и поэтому они поддерживают операции, которые изменяют объект списка на месте (Changing Lists In-Place). Возьмем для примера список и сделаем пару срезов:
a = [1, 2, 3, 4, 5]
a[1:3] # => [2, 3]
a[1:] # => [2, 3, 4, 5]
a[1:] = [6, 7] # => [1, 6, 7]
Список сортировать достаточно просто. Чтобы отсортировать сам список, можно использовать метод sort():
a = [5, 12, 3, 6, 1, 2, 7]
a.sort()
a # => [1, 2, 3, 5, 6, 7, 12]
Для сортировки списка без внесения изменений в оригинальный, используем функцию sorted():
a = ['CA', 'ba', 'Ab']
sorted(a) # => ['Ab', 'CA', 'ba']
Словари
Пустой словарь можно создать следующим образом:
a = {}
a = dict()
Структура словаря:
СЛОВАРЬ = {
КЛЮЧ_1: ЗНАЧЕНИЕ_1,
КЛЮЧ_2: ЗНАЧЕНИЕ_2,
...
}
print(СЛОВАРЬ[КЛЮЧ_1]) # => ЗНАЧЕНИЕ_1
Ключом в словаре может быть любой неизменяемый объект.
Словарь перебирать немного сложнее, чем список. Следующие методы упрощают работу со словарями:
items()- возвращает список кортежей из двух элементов. Первый элемент является ключом, второй – значением. Программистам на С++ это знакомо как пара (в STL шаблонpair).keys()- возвращает список ключей словаря.values()- возвращает список значений словаря.pop()- удаляет ключ и возвращает его значение.get()- возвращает значение элемента по указанному ключу илиNone, если такого ключа не существует.popitem()- удаляет последний элемент в словаре и возвращает кортеж из двух элементов: ключа и значения.clear()- полностью очищает словарь.copy()- копирование словаря.fromkeys()- принимает два параметра: итерируемый объект в качестве ключей (например, кортеж) и необязательный параметр, который является значением по умолчанию для каждого ключа.setdefault()- возвращает элемент словаря по указанному ключу. Если такого ключа нет, то в словарь запишется указанный ключ и значение по умолчанию, и вернется это значение.update()- добавление новых элементов и перезапись уже имеющихся ключей.
Далее пару примеров, чтобы вспомнить методы словарей в Python:
dict1 = {}
list1 = {3, 4, 5, 6}
dict1 = dict.fromkeys(list1, None)
print(dict1) # => {3: None, 4: None, 5: None, 6: None}
print(dict1.pop(5)) # => None
print(dict1) # => {3: None, 4: None, 6: None}
dict1.update({6: 'Six'})
print(dict1) # => {3: None, 4: None, 6: 'Six'}
Помните, мы говорили о возможности в Python инициализировать сразу несколько переменных? Воспользуемся этими знаниями и объединим их с методом items(), который возвращает кортеж из двух элементов:
numbers = {1: 'One', 2: 'Two', 3: 'Three', 4: 'Four'}
for k, v in numbers.items():
print(k, v)
- С версии Python 3.6. порядок элементов стал неизменяемым.
- Хранение словаря реализовано с помощью двух массивов, благодаря чему стало уходить меньше памяти на хранение.
Сортировать словарь по ключам можно с помощью метода items() и функции sorted(), которая возвращает отсортированный список из кортежей. Его нужно собрать в словарь. Да, я не упоминал функцию dict() в уроке про преобразование типов, настало время это исправить:
numbers = {1: 'One', 3: 'Three', 2: 'Two'}
numbers = sorted(numbers.items())
numbers # => [(1, 'One'), (2, 'Two'), (3, 'Three')]
dict(numbers) # => {1: 'One', 2: 'Two', 3: 'Three'}
Другой способ сортировать словарь по ключам:
numbers = {1: 'One', 2: 'Two', 4: 'Four', 3: 'Three'}
list_keys = list(numbers.keys())
list_keys.sort()
for i in list_keys:
print(i, ':', numbers[i])
Сортировать словарь по значению сложнее. В уроке мы подробно рассмотрели этот процесс, а сейчас лишь освежим в памяти:
import operator
numbers = {1: 'One', 2: 'Two', 3: 'Three', 4: 'Four'}
numbers = sorted(numbers.items(), key=operator.itemgetter(1))
dict(numbers) # => {4: 'Four', 1: 'One', 3: 'Three', 2: 'Two'}
Для удаления из словаря элемента или самого словаря, используйте ключевое слово del:
del numbers['One'] # удаление элемента с ключом One
del numbers # удаление словаря numbers
Множества
Пустое множество можно создать с помощью функции set() и, казалось бы, фигурных скобок {}, но во втором варианте есть нюанс.
a = set()
s = {}
print(type(s)) # => <class 'dict'>
Да, пустые словари и множества инициализируются одинаково, поэтому создание последних необходимо указывать явно при помощи функции set().
Для множеств в Python доступны следующие методы:
add()- добавление элемента во множество.remove()- удаление элемента из множества с вызовом исключенияKeyError, в случае отсутствия удаляемого элемента.discard()- удаление элемента из множества без вызова исключения.pop()- возвращает «случайный» элемент и удаляет его из множества.clear()- полностью очищает множество.intersection()- определение пересечения множеств.intersection_update()- определение пересечения множеств и изменение текущего.isdisjoint()- возвращает истину, если оба множества не имеют общих элементов.issubset()- является ли множество (для которого вызывается метод) подмножеством.issuperset()- является ли множество (для которого вызывается метод) надмножеством.union()- объединение двух множеств.difference()- определение элементов, которые есть в первом множестве, но нет во втором.differenсe_update()- определение элементов, которые есть в первом множестве, но нет во втором и изменение текущего множества.symmetric_difference()- определение элементов одного множества, которых нет во втором и элементов второго множества, которых нет в первом.symmetric_difference_update()- определение элементов одного множества, которых нет во втором и элементов второго множества, которых нет в первом. И изменение текущего множества.
Вернитесь к уроку об отношениях между множествами, чтобы вспомнить на примерах использование методов.
Кортежи
Пустой кортеж можно создать так же двумя способами: функция tuple() и пустые круглые скобки (). Честно говоря, я не знаю для чего это может вам пригодиться.
t = tuple()
t = ()
Чтобы создать кортеж с одним элементом, не забываем ставить запятую:
c = ("Строка", )
print(type(c)) # => <class 'tuple'>
Кортежи поддерживают такие же методы как и списки, за исключением тех, которые могут их поменять. Например, методы sort() и append() кортежи не поддерживают.
Общее
Мы упоминали функцию len(), которая возвращает количество элементов в итерируемом объекте (строка, список, словарь и т.д.):
# словарь
d = {4: 5, 1: 1, 3: 12, 2: 3}
len(d) # => 4
# строка
s = "Hello"
len(s) # => 5
Заключение
Раздел «Структуры данных в Python» получился объемным. Мы рассмотрели всего четыре структуры данных, но в тоже время затронули и другие важные базовые темы, понимание которых поможет с наименьшими потерями душевного равновесия разобраться с более сложным материалом в дальнейшем. Не буду много писать в заключении, и так много текста получилось. Переходите к следующему разделу, в котором мы вернемся к циклам и изучим новую тему: обработка исключений.
Переходите к следующему уроку курса, а так же не забудьте посмотреть новый материал на Codebra по тегу Python.
