Одна переменная может характеризовать всего лишь 1 параметр 1 части какой-либо системы. В простых случаях часто это бывает более чем достаточно. По мере усложнения задач, вы столкнетесь с появлением переменного числа однотипных параметров, значений, результатов. Вы не сможете под каждый определить отдельную переменную. Вам потребуется группировать ваши параметры или результаты по смыслу, потому что так вам будет проще ими управлять. Таким образом, вы придете к понятию структур данных. Самые базовые структуры данных встроены в питон. Это список, кортеж, множество и словарь.
8.1.1 Списки (list)
Список - массив однотипных данных переменной длины. Это самая частая используемая структура данных благодаря своей гибкости. Представьте большую коробку с пронумерованными ячейками. Ячейке этой коробки вы можете присвоить какое-либо значение. Номер ячейки называется индексом. Нумерация (индексация) в питон начинается с 0. Давайте создадим список. Выбор элементов по индексу в списках работает точно также, как выбор подстрок в строках.
Простой список из пяти элементов. Элементы перечисляются через запятую внутри квадратных скобок
2
Список может быть пустым
3
Мы можем получить элемент списка, обратясь к нему по индексу в квадратных скобках. В этом примере выведется третий элемент - 4.
Для каждого списка определены функции, которые позволяют манипулировать им. Они “хранятся” внутри списка. Обращение к ним выглядит следующим образом: имя_списка.имя_функции(). Список, как и любая сущность в питоне, это объект. У объекта есть некоторое внутреннее содержимое и, чтобы получить к нему доступ нужно через имя объекта обратиться к имени нужного содержимого через символ точки.
Рассмотрим операции, которые можно совершать над списком.
Найти элемент в списке, сгенерирует ошибку ValueError, если элемент не найден
5
Вставит число 22 на 4 позицию списка
6
Отсортирует список - функция изменяет сам список и ничего не возвращает
7
Получить количество элементов в списке
8
Проверить наличие элемента в списке
Заполнить список можно с помощью цикла, но в питоне для этого есть более изящный и оптимизированный способ - включения (comprehensions). Синтаксис включений не очень очевиден для новичка и годится только для простых операций в одно действие или с условием, где в каждой ветке не более одного действия: имя_списка = [действие(i) for i in некоторый_генератор if условие1 else действие_2 ]. Наличие условия в включении является необязательным.
Пример создания списка нечетных чисел
odd_numbers = [i for i inrange(1,20,2)]# Илиodd_numbers = [i for i inrange(20) if i %2==1]
8.1.2 Кортежи (tuple)
Кортежи, как и списки, являются последовательностями произвольных элементов. В отличие от списков кортежи неизменяемы. Это означает, что вы не можете добавить, удалить или изменить элементы кортежа после того, как определите его. Поэтому кортеж аналогичен константному списку.
Операция распаковки кортежа по отдельным переменным
Вы можете использовать кортежи вместо списков, но они имеют меньше возможностей — у них нет функций append(), insert() и т.д., поскольку кортеж не может быть изменен после создания. Почему же не применять везде списки вместо кортежей?
Кортежи занимают меньше места.
Вы не сможете уничтожить элементы кортежа по ошибке.
Вы можете использовать кортежи как ключи словаря
Именованные кортежи могут служить более простой альтернативой объектам.
Аргументы функции передаются как кортежи
8.1.3 Словари (dict)
Словарь очень похож на список, но порядок элементов в нем не имеет значения, и они выбираются не с помощью смещения. Вместо этого для каждого значения вы указываете связанный с ним уникальный ключ. Таким ключом в основном служит строка, но он может быть объектом одного из неизменяемых типов: булевой переменной, целым числом, числом с плавающей точкой, кортежем, строкой и другими объектами, которые вы увидите далее. Словари можно изменять, что означает, что вы можете добавить, удалить и изменить их элементы, которые имеют вид «ключ-значение».
Note
В других языках программирования словари могут называться ассоциативными массивами, хешами или хеш-таблицей. В Python словарь также называется dict для экономии места.
1example_dict = {"мама": 4, "яблоко":6, "Python":6}2del example_dict["Python"]3'яблоко'in example_dict4example_dict["карта"] =len("карта")5for k in example_dict.keys():print(k)6for v in example_dict.values():print(v)7for k,v in example_dict.items():print(f"{k}:{v}")
1
Создание словаря. Пары “ключ-значение” записаны в фигурных скобках через запятую. Синтаксис записи пары- ключ:значение
2
Удаление элемента из словаря по ключу
3
Проверка наличия ключа в словаре
4
Добавление новой записи с новым ключом в словарь. Если в словаре уже есть значение с этим ключом, то оно будет перезаписано.
5
Перебор всех ключей словаря
6
Перебор всех значений словаря.
7
Перебор одновременно и ключей, и значений. items возвращает кортеж из ключа и значения, который распаковывается в переменные k и v.
8.1.4 Множества (set)
Множество похоже на словарь, значения которого опущены. Он имеет только ключи. Как и в случае со словарем, ключи должны быть уникальны. Если вам нужно прикрепить к ключу некую информацию, воспользуйтесь словарем. Предположим, вы хотите объединить два множества, которые содержат несколько общих ключей. Поскольку множество должно содержать только уникаль ные значения, объединение двух множеств будет содержать лишь одно включение каждого ключа. Пустое множество — это множество, содержащее ноль элементов. Операции над множествами показаны на Figure 8.1 и Listing 8.1.
Figure 8.1: Визуализация операций над множествами с помощью кругов Эйлера
Listing 8.1: Реализация основных операций над множествами в Python
input_dict = {'a':1, 'b':2, 'c':3, 'd':4}s =0# input_dict.values() генератор значений словаря. Генератор это специальный тип функций, # который вместо того, чтобы возвращать весь список значений, возвращает их по одному. Важно для экономии памяти.for value in input_dict.values(): s += valueprint(s)
10
Дан список со строками. Оставьте в этом списке только те строки, которые начинаются на http://
input_list = ["kar", "meow", "https://rsmu.ru", "bioinf", "http://yandex.ru", "Russia"]#f-строки позваляют с помощью простой нотации вставлять в исходную строку значение переменной или # какого-либо выражения внутри фигурных скобокprint(f"Исходный список {input_list}")# Изменять исходный список - плохая идея, поэтому сделаем копию. Помним, что список - ссылочный тип.result_list = input_list.copy()for item in input_list:ifnot item.startswith("http://"): result_list.remove(item)print(f"Осталось {result_list}")
Исходный список ['kar', 'meow', 'https://rsmu.ru', 'bioinf', 'http://yandex.ru', 'Russia']
Осталось ['http://yandex.ru']
Дан некоторый список, например, вот такой:
[1, 2, 3, 4, 5, 6]
Поделите сумму элементов, стоящих на четных позициях, на сумму элементов, стоящих на нечетных позициях.
input_list = [1,2,3,4,5,6,7,8,9,10,11,12]sum_odd_pos =0sum_even_pos =0# enumerate возвращает генератор (позиция элемента, значение элемента)# i,v = tuple распаковка элементов кортежа по отдельным переменнымfor i, value inenumerate(input_list):if i %2==0: sum_even_pos += valueelse: sum_odd_pos += valueprint(sum_even_pos / sum_odd_pos)
Для написания кода потребуются структуры данных, которые могут хранить примитивные переменные по определенному принципу: списки, кортежи, словари, множества
Список - изменяемый массив. К элементам массива можно обращаться по индексу, можно удалять, добавлять и искать элементы
Кортеж - неизменяемый массив. Незаменим в некоторых ситуациях. Чаще используется список
Словарь - хранит пары ключ-значение. Ключи уникальны, значения нет
Множества - неупорядоченный массив уникальных значений.
8.4 Задачи
8.4.1 Разминка
Дана строка. Выведите её на экран посимвольно.
Дана некоторая строка: ‘abcdeabc’ . Очистите ее от повторов символов
Даны две строки. Найдите все общие уникальные символы и все символы, которые есть в первой, но нет во второй и наоборот. Выведите все символы алфавита, которых нет в этих строках.
Организуйте ввод чисел с клавиатуры, пока не будет введен 0. Сохраняйте числа в список. Если в получившемся списке есть отрицательные числа, поменяйте знак каждого числа
Дан некоторый список, например, вот такой: [1, 2, 3, 4, 5, 6]. Поделите сумму элементов, стоящих на четных позициях, на сумму элементов, стоящих на нечетных позициях.
Дан список со строками. Оставьте в этом списке только те строки, которые начинаются на http://
8.4.2Задача 1: Скрабл
В настольной игре Скрабл (Scrabble) каждая буква имеет определенную ценность. В случае с английским алфавитом очки распределяются так:
A, E, I, O, U, L, N, S, T, R – 1 очко;
D, G – 2 очка;
B, C, M, P – 3 очка;
F, H, V, W, Y – 4 очка;
K – 5 очков;
J, X – 8 очков;
Q, Z – 10 очков.
А русские буквы оцениваются так:
А, В, Е, И, Н, О, Р, С, Т – 1 очко;
Д, К, Л, М, П, У – 2 очка;
Б, Г, Ё, Ь, Я – 3 очка;
Й, Ы – 4 очка;
Ж, З, Х, Ц, Ч – 5 очков;
Ш, Э, Ю – 8 очков;
Ф, Щ, Ъ – 10 очков.
Напишите программу, которая вычисляет стоимость введенного пользователем слова. Будем считать, что на вход подается только одно слово, которое содержит либо только английские, либо только русские буквы.
8.4.3 Задача №2. Коты и владельцы
В базе данных ветеринарной клиники информация о пациентах-котах хранится в списке кортежей. Данные о кошках и их владельцах записаны в формате «Кличка животного, Возраст животного, Имя владельца, Фамилия владельца»ю
Обнаружилось, что имена некоторых владельцев повторяются, потому что у них несколько кошек. Необходимо оптимизировать хранение данных таким образом, чтобы для каждого владельца при выводе на печать данные о всех его животных отображались в одной строке:
Игорь Бероев: Муся, 7; Изольда, 2
8.4.4 Задача №3. Сортировка пузырьком.
Сгенерируйте случайный массив длиной N=10. Отсортируйте его с помощью алгоритма сортировки пузырьком
Сгенерируйте массивы разной длины (10,100,1000,10000, 100000). Замерьте время работы сортировки пузырьком. Сделайте вывод о времени работы алгоритма.
8.4.5 Задача №4*. Ханойская башня
Реализуйте детскую игру “Ханойская башня”. Вместо колечек разной длины - цифры от 1 до 7. Игра инициализируется в случайном порядке. Игрок имеет три колышка, между которыми он может перемещать колечки. Игрок указывает с какого колышка на какой переместить верхнее колечко. Цель - собрать упорядоченную башенку на одном из колышков.