Основные операции с множествами
Тип set в Python поддерживает несколько основных операций над множествами.
>>> a_set = {2, 4, 5, 9, 12, 21, 30, 51, 76, 127, 195}
>>> 30 in a_set ①
True
>>> 31 in a_set
False
>>> b_set = {1, 2, 3, 5, 6, 8, 9, 12, 15, 17, 18, 21}
>>> a_set.union(b_set) ②
{1, 2, 195, 4, 5, 6, 8, 12, 76, 15, 17, 18, 3, 21, 30, 51, 9, 127}
>>> a_set.intersection(b_set) ③
{9, 2, 12, 5, 21}
>>> a_set.difference(b_set) ④
{195, 4, 76, 51, 30, 127}
>>> a_set.symmetric_difference(b_set) ⑤
{1, 3, 4, 6, 8, 76, 15, 17, 18, 195, 127, 30, 51}
① | Чтобы проверить, принадлежит ли значение множеству, используйте оператор in. Он работает так же, как и для списков. |
② | Метод union() (объединение) возвращает новое множество, содержащее все элементы каждого из множеств. |
③ | Метод intersection() (пересечение) возвращает новое множество, содержащее все элементы, которые есть и в первом множестве, и во втором. |
④ | Метод difference() (разность) возвращает новое множество, содержащее все элементы, которые есть в множестве a_set, но которых нет в множестве b_set. |
⑤ | Метод symmetric_difference() (симметрическая разность) возвращает новое множество, которое содержит только уникальные элементы обоих множеств. |
Три из этих методов симметричны.
# продолжение предыдущего примера
>>> b_set.symmetric_difference(a_set) ①
{3, 1, 195, 4, 6, 8, 76, 15, 17, 18, 51, 30, 127}
>>> b_set.symmetric_difference(a_set) == a_set.symmetric_difference(b_set) ②
True
>>> b_set.union(a_set) == a_set.union(b_set) ③
True
>>> b_set.intersection(a_set) == a_set.intersection(b_set) ④
True
>>> b_set.difference(a_set) == a_set.difference(b_set) ⑤
False
① | Симметрическая разность множеств a_set и b_set выглядит не так, как симметрическая разность множеств b_set и a_set, но вспомните, множества неупорядочены. Любые два множества, все (без исключения) значения которых одинаковы, считаются равными. |
② | Именно это здесь и произошло. Глядя на печатное представление этих множеств, созданное оболочкой Python, не обманывайтесь. Значения элементов этих множеств одинаковы, поэтому они равны. |
③ | Объединение двух множеств также симметрично. |
④ | Пересечение двух множеств также симметрично. |
⑤ | Разность двух множеств несимметрична. По смыслу, данная операция аналогична вычитанию одного числа из другого. Порядок операндов имеет значение. |
Наконец, есть ещё несколько вопросов по множествам, которые вы можете задать.
>>> a_set = {1, 2, 3}
>>> b_set = {1, 2, 3, 4}
>>> a_set.issubset(b_set) ①
True
>>> b_set.issuperset(a_set) ②
True
>>> a_set.add(5) ③
>>> a_set.issubset(b_set)
False
>>> b_set.issuperset(a_set)
False
① | Множество a_set является подмножеством b_set — все элементы a_set также являются элементами b_set. |
② | И наоборот, b_set является надмножеством a_set, потому что все элементы a_set также являются элементами b_set. |
③ | Поскольку вы добавили элемент в a_set, но не добавили в b_set, обе проверки вернут значение False. |
Множества в логическом контексте
Вы можете использовать множества в логическом контексте, например, в операторе if.
>>> def is_it_true(anything):
... if anything:
... print("да, это истина")
... else:
... print("нет, это ложь")
...
>>> is_it_true(set()) ①
нет, это ложь
>>> is_it_true({'a'}) ②
да, это истина
>>> is_it_true({False}) ③
да, это истина
① | В логическом контексте пустое множество — ложь. |
② | Любое множество, содержащее хотя бы один элемент — истина. |
③ | Любое множество, содержащее хотя бы один элемент — истина. Значения элементов не важны. |
Словари
Словарь — это неупорядоченное множество пар ключ—значение. Когда вы добавляете ключ в словарь, вы также должны добавить и значение для этого ключа. (Значение всегда можно изменить позже.) Словари в Python оптимизированы для получения значения по известному ключу, но не для других целей.
Словарь в Python аналогичен хэшу в Perl 5. В Perl 5 переменные, хранящие хэши, всегда начинаются с символа %. В Python переменные могут быть названы как угодно, язык сам отслеживает типы данных. |
Создание словаря
Создать словарь очень просто. Синтаксис похож на синтаксис создания множеств, но вместо элементов, используются пары ключ-значение. Если у вас есть словарь, вы можете просматривать значения по их ключу.
>>> a_dict = {'server': 'db.diveintopython3.org', 'database': 'mysql'} ①
>>> a_dict
{'server': 'db.diveintopython3.org', 'database': 'mysql'}
>>> a_dict['server'] ②
'db.diveintopython3.org'
>>> a_dict['database'] ③
'mysql'
>>> a_dict['db.diveintopython3.org'] ④
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'db.diveintopython3.org'
Перевод сообщения оболочки:
Раскрутка стека (список последних вызовов):
Файл "<stdin>", строка 1, <модуль>
KeyError: 'db.diveintopython3.org'
① | Сначала вы создаёте новый словарь с двумя элементами и присваиваете его переменной a_dict. Каждый элемент является парой ключ—значение, а весь набор элементов заключён в фигурные скобки. |
② | 'server' является ключом, и он связан со значением, обращение к которому с помощью a_dict['server'] даст нам 'db.diveintopython3.org'. |
③ | 'database' является ключом, и он связан со значением, обращение к которому с помощью a_dict['database'] даст нам 'mysql'. |
④ | Можно получить значение по ключу, но нельзя получить ключи по значению. Так a_dict['server'] — это 'db.diveintopython3.org', но a_dict['db.diveintopython3.org'] породит исключение, потому что 'db.diveintopython3.org' не является ключом. |
Изменение словаря
Словари не имеют какого-либо предопределенного ограничения размера. Когда угодно можно добавлять новые пары ключ—значение в словарь или изменять значение, соответствующее существующему ключу. Продолжим предыдущий пример:
>>> a_dict
{'server': 'db.diveintopython3.org', 'database': 'mysql'}
>>> a_dict['database'] = 'blog' ①
>>> a_dict
{'server': 'db.diveintopython3.org', 'database': 'blog'}
>>> a_dict['user'] = 'mark' ②
>>> a_dict ③
{'server': 'db.diveintopython3.org', 'user': 'mark', 'database': 'blog'}
>>> a_dict['user'] = 'dora' ④
>>> a_dict
{'server': 'db.diveintopython3.org', 'user': 'dora', 'database': 'blog'}
>>> a_dict['User'] = 'mark' ⑤
>>> a_dict
{'User': 'mark', 'server': 'db.diveintopython3.org', 'user': 'dora', 'database': 'blog'}