Рассмотрим ещё одну коллекцию Python — множество (set
). Чтобы задать множество, можно перечислить его элементы внутри фигурных скобок. Например, создадим множество гласных букв русского алфавита:
1vowels = {"а", "е", "ё", "и", "о", "у", "ы", "э", "ю", "я"}
Для создания пустого множества следует использовать функцию set()
без аргументов, а для определения количества элементов используется уже известная нам функция len()
:
1empty_set = set()
2print(f"Длина пустого множества равна {len(empty_set)}.")
Вывод программы:
Длина пустого множества равна 0.
Множество можно получить из других коллекций, применив к ним функцию set()
. Например, создадим множество из строки:
1word = "коллекция"
2letters = set(word)
3print(letters)
Выполнив программу два раза, получим следующий вывод программы:
{'е', 'о', 'и', 'я', 'к', 'л', 'ц'} {'л', 'к', 'и', 'ц', 'я', 'е', 'о'}
Обратите внимание: порядок вывода элементов множества при выполнении примера может меняться произвольно из-за свойства неупорядоченности множества. Так, элементы множества не имеют индексов, и можно только проверить принадлежность элемента множеству.
Другое свойство множества — уникальность его элементов: они не имеют дублей.
В итоге в примере мы получили множество уникальных букв слова, потеряв при этом порядок.
Проверить, принадлежит ли значение множеству, можно с помощью оператора in
.
Узнаем, принадлежит ли введённая буква русского алфавита к гласным:
1vowels = {"а", "е", "ё", "и", "о", "у", "ы", "э", "ю", "я"}
2letter = input("Введите букву русского алфавита: ")
3if letter.lower() in vowels:
4 print("Гласная буква")
5else:
6 print("Согласная буква")
По элементам множества можно пройти в цикле:
1vowels = {"а", "е", "ё", "и", "о", "у", "ы", "э", "ю", "я"}
2for letter in vowels:
3 print(letter)
Выполнив пример несколько раз, мы снова видим разную последовательность вывода букв.
Множества в Python позволяют выполнять следующие операции:
- Объединение множеств. Возвращает множество, состоящее из элементов всех объединяемых множеств. Обозначается
union()
или|
. Графическое представление операции:
Пример:
1s_1 = {1, 2, 3}
2s_2 = {3, 4, 5}
3s_union = s_1 | s_2
4# s_union = s_1.union(s_2)
5print(s_union)
Вывод программы:
{1, 2, 3, 4, 5}
- Пересечение множеств. Возвращает множество, состоящее из общих элементов пересекаемых множеств. Обозначается
intersection
или&
. Графическое представление операции:
Пример:
1s_1 = {1, 2, 3}
2s_2 = {3, 4, 5}
3s_intersection = s_1 & s_2
4# s_intersection = s_1.intersection(s_2)
5print(s_intersection)
Вывод программы:
{3}
- Разность множеств. Возвращает множество, где указаны элементы из первого множества, которых нет во втором — вычитаемом — множестве. Обозначается
difference
или-
. Графическое представление операции:
Пример:
1s_1 = {1, 2, 3}
2s_2 = {3, 4, 5}
3s_dif = s_1 - s_2
4# s_dif = s_1.difference(s_2)
5print(s_dif)
Вывод программы:
{1, 2}
- Симметричная разность множеств. Возвращает множество, состоящее из элементов, встречающихся в первом или втором множестве, но не в обоих сразу. Обозначается
symmetric_difference
или^
.
Пример:
1s_1 = {1, 2, 3}
2s_2 = {3, 4, 5}
3s_sym_dif = s_1 ^ s_2
4# s_sym_dif = s_1.symmetric_difference(s_2)
5print(s_sym_dif)
Вывод программы:
{1, 2, 4, 5}
В качестве примера использования множеств и их операций определим, какие гласные буквы встречаются в слове «коллекция»:
1vowels = {"а", "е", "ё", "и", "о", "у", "ы", "э", "ю", "я"}
2letters = set("коллекция")
3print(", ".join(letters & vowels))
Вывод программы:
о, я, и, е
Для множеств Python доступны следующие операции сравнения:
- Совпадение двух множеств. Обозначается
==
. Пример:
1s_1 = {1, 2, 3}
2s_2 = {3, 1, 2}
3print(s_1 == s_2)
Вывод программы:
True
- Подмножество. Все элементы первого множества есть во втором. Обозначается
<=
. Пример:
1s_1 = {1, 2, 3}
2s_2 = {1, 2, 3, 4}
3print(s_1 <= s_2)
Вывод программы:
True
- Надмножество. Первое множество содержит все элементы второго. Обозначается
>=
. Пример:
1s_1 = {1, 2, 3, 4}
2s_2 = {1, 2, 3}
3print(s1 >= s2)
Вывод программы:
True
Множество является изменяемой коллекцией. Методы, изменяющие исходное множество, перечислены в следующей таблице.
Метод |
Описание |
Пример |
Вывод |
set.add(e) |
Добавить элемент во множество |
s = set() |
|
set.remove(e) |
Удалить элемент множества. Возвращает исключение KeyError, если элемент не принадлежит множеству |
s = {1, 2, 3} |
|
set.discard(e) |
Удалить элемент, если он принадлежит множеству |
s = {1, 2, 3} |
|
set.pop() |
Вернуть и удалить произвольный элемент множества |
s = {1, 2, 3} |
2 |
set.clear() |
Очистить множество, удалив все его элементы |
s = {1, 2, 3} |
set() |
Чтобы перейти к ещё одной коллекции, рассмотрим пример: пусть в программе нужно хранить информацию о странах и их столицах. Эту задачу можно решить и с помощью известных нам коллекций. К примеру, списком, в котором элементами будут кортежи, содержащие пары значений — страну и её столицу:
1countries_and_capitals = [("Россия", "Москва"), ("США", "Вашингтон"), ("Франция", "Париж")]
Представим, что в такой программе нам необходимо вывести столицу для какой-то страны, например для Франции. Тогда нам придётся пройти в цикле по списку кортежей, сравнивая нулевой элемент каждого кортежа со строкой «Франция». Когда такой кортеж будет найден, мы выведем первый элемент этого кортежа, содержащий строку с названием столицы:
1countries_and_capitals = [("Россия", "Москва"), ("США", "Вашингтон"), ("Франция", "Париж")]
2for country in countries_and_capitals:
3 if country[0] == "Франция":
4 print(country[1])
5 break
Было бы неплохо, если бы мы могли взять из коллекции значение (название столицы в нашем примере) по названию страны, то есть не по числовому индексу, а по строке. Такая коллекция есть в Python. Она называется «словарь» (dict
). Словарь похож на список, но вместо индексов элементов в словаре используются ключи, а по ключам в словаре хранятся значения.
Благодаря словарям нашу программу можно переписать, используя в качестве ключей словаря названия стран, а в качестве значений по ключам — названия столиц этих стран:
1countries_and_capitals = {"Россия": "Москва",
2 "США": "Вашингтон",
3 "Франция": "Париж"}
4print(countries_and_capitals["Франция"])
Как видно из программы, для создания словаря можно перечислить в фигурных скобках пары: ключ и значение. Ключ и значение отделяются двоеточием и пробелами, а пары перечисляются через запятую.
В качестве ключей можно использовать значения неизменяемого типа: числа, строки, кортежи. Значения по ключу могут быть любого типа данных.
Чтобы взять значение по ключу, необходимо указать ключ в квадратных скобках после имени словаря.
Если же нужно добавить новый ключ в словарь, то его указывают после имени словаря в левой части операции присваивания, а значение, которое будет храниться по этому ключу, — в правой части:
1countries_and_capitals = {"Россия": "Москва",
2 "США": "Вашингтон",
3 "Франция": "Париж"}
4countries_and_capitals["Сербия"] = "Белград"
5print(countries_and_capitals)
Обратите внимание, при записи значения по уже существующему ключу он создаётся заново с новым значением, а прошлый стирается:
1d = {"key": "old_value"}
2d["key"] = "new_value"
3print(d["key"])
Вывод программы:
new_value
При попытке взять значение по несуществующему ключу происходит исключение KeyError:
1countries_and_capitals = {"Россия": "Москва",
2 "США": "Вашингтон",
3 "Франция": "Париж"}
4print(countries_and_capitals["Сербия"])
Вывод программы:
KeyError: 'Сербия'
Для проверки существования ключа в словаре следует использовать уже известный нам оператор in
:
1countries_and_capitals = {"Россия": "Москва",
2 "США": "Вашингтон",
3 "Франция": "Париж"}
4if "Сербия" in countries_and_capitals:
5 print(countries_and_capitals["Сербия"])
6else:
7 print("Страна пока не добавлена в словарь")
По ключам в словаре можно пройти в цикле for
:
1countries_and_capitals = {"Россия": "Москва",
2 "США": "Вашингтон",
3 "Франция": "Париж"}
4for country in countries_and_capitals:
5 print(f"У страны {country} столица — {countries_and_capitals[country]}.")
Вывод программы:
У страны Россия столица — Москва. У страны США столица — Вашингтон. У страны Франция столица — Париж.
Вспомним, что значением по ключу в словаре может быть значение любого типа. Рассмотрим пример, в котором значением по ключу будет список.
Пусть с клавиатуры вводятся названия стран, каждая с новой строки. При вводе возможны повторы стран. Сигналом окончания ввода будет строка «СТОП». Необходимо вывести, в каких строках (начиная с 0) встречалась каждая из стран. Для решения задачи будем использовать словарь, в котором по ключам — названиям стран будем хранить список номеров строк, в которых эти страны встречались.
1# создаём пустой словарь
2countries = dict()
3# вводим первую строку до цикла (можно заменить, использовав оператор-морж)
4country = input()
5# создаём счётчик номеров строк
6str_number = 0
7# продолжаем цикл, пока не введена строка «СТОП»
8while country != "СТОП":
9 # если введённой страны нет в словаре, создаём ключ и записываем по ключу список из одного номера строки
10 if country not in countries:
11 countries[country] = [str_number]
12 # иначе добавляем в список по ключу новое значение номера строки
13 else:
14 countries[country].append(str_number)
15 # увеличиваем счётчик
16 str_number += 1
17 # вводим следующую строку
18 country = input()
19# выводим название страны и полученные списки с новой строки
20for country in countries:
21 print(f"{country}: {countries[country]}")
Пример ввода:
США США Россия Россия Россия Франция Сербия СТОП
Вывод программы:
США: [0, 1] Россия: [2, 3, 4] Франция: [5] Сербия: [6]
Основные операции для словарей перечислены в следующей таблице.
Операция |
Описание |
Пример |
Вывод |
len(d) |
Возвращает количество ключей в словаре |
d = {"a": 1, "b": 2, "c": 3} |
3 |
del d[key] |
Удалить ключ из словаря. Если ключа нет, то вызывается исключение KeyError |
d = {"a": 1, "b": 2, "c": 3} |
|
dict.clear() |
Удалить все ключи и значения в словаре |
d = {"a": 1, "b": 2, "c": 3} |
{} |
dict.copy() |
Возвращает копию словаря |
d = {"a": 1, "b": 2, "c": 3} |
|
dict.get(key, default) |
Возвращает значение по ключу key. Если ключа нет, то возвращает значение default |
d = {"a": 1, "b": 2, "c": 3} |
Ключа нет в словаре |
dict.items() |
Возвращает итерируемый объект, состоящий из кортежей (ключ, значение) словаря |
d = {"a": 1, "b": 2, "c": 3} |
a 1 |
dict.keys() |
Возвращает итерируемый объект, состоящий из ключей словаря |
d = {"a": 1, "b": 2, "c": 3} |
a |
d.pop(key, default) |
Возвращает значение по ключу key и удаляет его из словаря. Если ключа нет, то возвращает default |
d = {"a": 1, "b": 2, "c": 3} |
1 |
dict.values() |
Возвращает итерируемый объект, состоящий из значений словаря |
d = {"a": 1, "b": 2, "c": 3} |
1 |
Перепишем код примера про страны с использованием метода get()
:
1# создаём пустой словарь
2countries = dict()
3# вводим первую строку до цикла (можно заменить, использовав оператор-морж)
4country = input()
5# создаём счётчик номеров строк
6str_number = 0
7# продолжаем цикл, пока не введена строка «СТОП»
8while country != "СТОП":
9 # Если страна country есть среди ключей, то get() возвращает список,
10 # хранящийся по этому ключу, иначе get() возвращает пустой список.
11 # Добавляем в список значение str_number.
12 countries[country] = countries.get(country, []) + [str_number]
13 # увеличиваем счётчик
14 str_number += 1
15 # вводим следующую строку
16 country = input()
17# выводим название страны и полученные списки с новой строки
18for country in countries:
19 print(f"{country}: {countries[country]}")
Метод get()
позволил заменить четыре строчки программы одной. Проверьте самостоятельно, что вывод программы не изменился для прежних входных данных.