Рубрики
Без рубрики

Наборы Python: что, Почему и как

Python оснащен несколькими встроенными типами данных, чтобы помочь нам организовать наши данные. Эти структуры … помечены Python, наборами, учебником.

Python оснащен несколькими встроенными типами данных, чтобы помочь нам организовать наши данные. Эти структуры включают списки, словари, кортежи и наборы Отказ

Из документации Python 3:

Набор – это Неупорядоченная коллекция без Дублирующие элементы Отказ Основные применения включают Членство тестирование и Устранение дубликатов записей Отказ Установленные объекты также поддерживают математические операции, такие как союз , пересечение , Разница и Симметричная разница Отказ

В этой статье мы собираемся рассмотреть и увидеть примеры каждого из элементов, перечисленных в вышеуказанном определении. Давайте начнем сразу и посмотрите, как мы можем их создать.

Инициализация набора

Существует два способа создания набора: один – предоставить встроенный функцию Установить () С списком элементов, а другой – использовать фигурные скобки {} Отказ

Инициализация набора, используя Установить () Встроенная функция:

>>> s1 = set([1, 2, 3])
>>> s1
{1, 2, 3}
>>> type(s1)

Инициализация набора с использованием фигурных скобок {}

>>> s2 = {3, 4, 5}
>>> s2
{3, 4, 5}
>>> type(s2)

>>>

Как вы можете видеть, оба варианта действительны. Проблема приходит, когда мы хотим, это пустой:

>>> s = {}
>>> type(s)

Это верно, мы получим словарь вместо набора, если мы используем пустые фигурные скобки =)

Домашний момент упомянуть, что ради простоты все примеры, представленные в этой статье, будут использовать однозначные целые числа, но наборы могут иметь все Ошибчивый Типы данных, которые поддерживают Python. Другими словами, целые числа, струны и кортежи, но не Musable предметы, такие как Списки или Словари :

>>> s = {1, 'coffee', [4, 'python']}
Traceback (most recent call last):
  File "", line 1, in 
TypeError: unhashable type: 'list'

Теперь, когда вы знаете, как создать набор и какой тип элементов он может содержать, давайте продолжим и посмотрим Почему Мы всегда должны иметь их в нашем инструменте.

Почему вы должны использовать их

При написании кода вы можете сделать это более одного пути. Некоторые считаются довольно плохими, а другие, Очистить, лаконичный и поддерживаемый Отказ Или ” pythonic “.

От Руководство автоматов к Python :

Когда ветеран Python Developer (Pythonista) вызывает порции кода, а не «Pythonic», они обычно означают, что эти линии кода не соблюдают общие рекомендации и не могут выражать свои намерения в том, что считается лучшим (услышать: наиболее читаемый) способ.

Давайте начнем изучать способ, которым наборы Python могут помочь нам не только с читаемостью, но также ускоряют время выполнения программ.

Неупорядоченная коллекция элементов

Первые вещи первыми: вы не можете получить доступ к заданному элементу с помощью индексов.

>>> s = {1, 2, 3}
>>> s[0]
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'set' object does not support indexing

Или изменить их с ломтиками:

>>> s[0:2]
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'set' object is not subscriptable

Но, если то, что нам нужно, это удалить дубликаты или делать математические операции, такие как сочетание списков (союзов), мы можем, и Должен Всегда используйте наборы.

Я должен упомянуть, что при итерации, наборы превзойдены списками, поэтому предпочитаю их, если это то, что вам нужно. Почему? Ну, эта статья не намерена объяснить внутреннюю работу наборов, но если вы заинтересованы, вот несколько ссылок, где вы можете прочитать об этом:

Нет дублирующихся предметов

Во время написания этого я не могу перестать думать во все времена, которые я использовал для петля и Если Заявление для проверки и удаления дубликатовных элементов в списке. Мое лицо становится красной, вспоминая, что, не раз, я написал что-то подобное:

>>> my_list = [1, 2, 3, 2, 3, 4]
>>> no_duplicate_list = []
>>> for item in my_list:
...     if item not in no_duplicate_list:
...             no_duplicate_list.append(item)
...
>>> no_duplicate_list
[1, 2, 3, 4]

Или использовал список пометков:

>>> my_list = [1, 2, 3, 2, 3, 4]
>>> no_duplicate_list = []
>>> [no_duplicate_list.append(item) for item in my_list if item not in no_duplicate_list]
[None, None, None, None]
>>> no_duplicate_list
[1, 2, 3, 4]

Но все в порядке, ничего этого не имеет значения, потому что у нас сейчас есть множества в нашем арсенале:

>>> my_list = [1, 2, 3, 2, 3, 4]
>>> no_duplicate_list = list(set(my_list))
>>> no_duplicate_list
[1, 2, 3, 4]
>>>

Теперь давайте будем использовать Время течения Модуль и посмотрите время выполнения списков и наборов при удалении дубликатов:

>>> from timeit import timeit
>>> def no_duplicates(list):
...     no_duplicate_list = []
...     [no_duplicate_list.append(item) for item in list if item not in no_duplicate_list]
...     return no_duplicate_list
...
>>> # first, let's see how the list perform:
>>> print(timeit('no_duplicates([1, 2, 3, 1, 7])', globals=globals(), number=1000))
0.0018683355819786227
>>> from timeit import timeit
>>> # and the set:
>>> print(timeit('list(set([1, 2, 3, 1, 2, 3, 4]))', number=1000))
0.0010220493243764395
>>> # faster and cleaner =)

Не только мы пишем Меньше линий С наборами, чем со списками, мы также получаем больше читаемый и исполнительные средства код.

Примечание. Помните, что наборы неупорядоченные, поэтому нет никакой гарантии, что при преобразовании их обратно в список порядок элементов будет сохранен.

От Дзэн Питона :

Красивая лучше, чем уродливая. Явное лучше, чем неявное. Просто лучше сложного. Квартира лучше, чем вложенный.

Не устанавливаются просто красивые, явные, простые и плоские? =)

Членство тестов

Каждый раз, когда мы используем Если Заявление, чтобы проверить, является ли элемент, например, в списке, вы выполняете тест на членство:

my_list = [1, 2, 3]
>>> if 2 in my_list:
...     print('Yes, this is a membership test!')
...
Yes, this is a membership test!

И наборы являются более исполнительными, чем списки при их выполнении:

>>> from timeit import timeit
>>> def in_test(iterable):
...     for i in range(1000):
...             if i in iterable:
...                     pass
...
>>> timeit('in_test(iterable)',
... setup="from __main__ import in_test; iterable = list(range(1000))",
... number=1000)
12.459663048726043
>>> from timeit import timeit
>>> def in_test(iterable):
...     for i in range(1000):
...             if i in iterable:
...                     pass
...
>>> timeit('in_test(iterable)',
... setup="from __main__ import in_test; iterable = set(range(1000))",
... number=1000)
0.12354438152988223
>>>

Примечание: приведенные выше тесты из Это Нить стоковой двери.

Поэтому, если вы делаете сравнение таких в огромных списках, он должен ускорить вас, если вы преобразуете этот список в комплект.

Как их использовать

Теперь, когда вы знаете, какой набор есть и почему вы должны использовать их, давайте сделаем быстрый тур и посмотрим, как мы можем изменить и работать с ними.

Добавление элементов

В зависимости от количества элементов для добавления нам придется выбирать между Добавить () и Обновление () методы.

Добавить () добавит один элемент:

>>> s = {1, 2, 3}
>>> s.add(4)
>>> s
{1, 2, 3, 4}

И Обновление () Несколько:

>>> s = {1, 2, 3}
>>> s.update([2, 3, 4, 5, 6])
>>> s
{1, 2, 3, 4, 5, 6} 

Помните, наборы удаляют дубликаты.

Удаление элементов

Если вы хотите быть предупрежденным, когда ваш код пытается удалить элемент, который не находится в наборе, используйте Удалить () Отказ В противном случае Откажитесь от () Предоставляет хорошую альтернативу:

>>> s = {1, 2, 3}
>>> s.remove(3)
>>> s
{1, 2}
>>> s.remove(3)
Traceback (most recent call last):
  File "", line 1, in 
KeyError: 3

Откажитесь от () не поднимет никаких ошибок:

>>> s = {1, 2, 3}
>>> s.discard(3)
>>> s
{1, 2}
>>> s.discard(3)
>>> # nothing happens!

Мы также можем использовать поп () Для случайного отказаться от элемента:

>>> s = {1, 2, 3, 4, 5}
>>> s.pop()  # removes an arbitrary element
1
>>> s
{2, 3, 4, 5}

Или Очистить () Чтобы удалить все значения из набора:

>>> s = {1, 2, 3, 4, 5}
>>> s.clear()  # discard all the items
>>> s
set()

Союз ()

Союз () или |. Создает новый набор, который содержит все элементы из множеств, которые мы предоставляем:

>>> s1 = {1, 2, 3}
>>> s2 = {3, 4, 5}
>>> s1.union(s2)  # or 's1 | s2'
{1, 2, 3, 4, 5}

пересечение ()

пересечение или & вернется набор, содержащий только элементы, которые распространены во всех них:

>>> s1 = {1, 2, 3}
>>> s2 = {2, 3, 4}
>>> s3 = {3, 4, 5}
>>> s1.intersection(s2, s3)  # or 's1 & s2 & s3'
{3}

разница()

Использование Различия () или - Создает новый набор со значениями, которые находятся в «S1», но не в «S2»:

>>> s1 = {1, 2, 3}
>>> s2 = {2, 3, 4}
>>> s1.difference(s2)  # or 's1 - s2'
{1}

Symmetric_diference ()

Symetric_Difference или ^ вернет все значения, которые не распространены между наборами.

>>> s1 = {1, 2, 3}
>>> s2 = {2, 3, 4}
>>> s1.symmetric_difference(s2)  # or 's1 ^ s2'
{1, 4}

Выводы

Я надеюсь, что после прочтения этой статьи вы знаете, что такое набор, как манипулировать своими элементами и операциями, которые они могут выполнять. Знание, когда использовать набор, безусловно, поможет вам написать Cleaner Code и ускорить ваши программы.

Если у вас есть какие-либо сомнения, пожалуйста, оставьте комментарий, и я с удовольствием попытаюсь ответить на них. Кроме того, не забывайте, что если вы уже понимаете, у них есть свои место в Python Chechsheet , где вы можете иметь краткую ссылку и освежить то, что вы уже знаете.

Оригинал: “https://dev.to/wilfredinni/python-sets-what-why-and-how-5a1n”