Установить понимание в Python 3 для начинающих

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

Как это работает

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

Давайте посмотрим на несколько примеров. Что, если у меня есть какой-то текст, и я хочу вытащить все уникальные слова в виде набора?

sentence = "The cat in the hat had two sidekicks, thing one and thing two."

Для правильной работы я сделаю sentence полностью строчными буквами, а затем удалю запятую и точку. Это можно сделать с помощью функций lower() и replace(). Затем я могу использовать функцию split(), чтобы разделить его на список слов и оттуда сгенерировать набор всех уникальных слов:

words = sentence.lower().replace('.', '').replace(',', '').split()
unique_words = {word for word in words}

Вот как теперь будет выглядеть наш unique_words набор:

{'and', 'cat', 'had', 'hat', 'in', 'one', 'sidekicks', 'the', 'thing', 'two'}

Как видите, исходный порядок слов в предложении не был сохранен в результате. В этом случае он выплевывает их в алфавитном порядке, однако это не обязательно будет происходить каждый раз. Когда вы думаете о наборе, порядок на самом деле не имеет значения. Важно то, что слова, которые встречаются в предложении несколько раз («тот» и «вещь»), теперь появляются в наборе только один раз.

Условные выражения в рамках набора понятий

Чтобы расширить приведенный выше пример, что, если бы я хотел отфильтровать любые слова, содержащие более трех букв? Вот как бы я это сделал:

unique_words = {word for word in words if len(word) <= 3}

Выход:

{'and', 'cat', 'had', 'hat', 'in', 'one', 'the', 'two'}

Чтобы показать, что мы можем, давайте снова вернем все уникальные слова, но на этот раз сделаем заглавными те, которые начинаются с буквы «h», а остальные оставим без изменений:

unique_words = {word.capitalize() if word[0] == 'h' else word for word in words}

Выход:

{'Had', 'Hat', 'and', 'cat', 'in', 'one', 'sidekicks', 'the', 'thing', 'two'}

Мы даже можем выполнить оба приведенных выше примера вместе в одном наборе:

unique_words = {word.capitalize() if word[0] == 'h' else word for word in words if len(word) <= 3}

Выход:

{'Had', 'Hat', 'and', 'cat', 'in', 'one', 'the', 'two'}

Вложенные представления множеств

Как и в случае со списками и словарями, вы можете вложить одно понимание набора в другое, хотя есть одно очень важное предостережение. Обычно в Python, когда дело доходит до наборов внутри наборов, внутренние наборы должны быть замороженными наборами, иначе вы получите ошибку. Замороженный набор похож на набор, хотя наборы являются изменяемыми, а замороженные - нет. Причина, по которой нам нужно это сделать, заключается в том, что к изменяемым объектам нельзя получить доступ с помощью поиска в памяти на основе хэшей, который необходим для правильной работы набора. Другими словами, наборы являются изменяемыми, что делает их нехэшируемыми, и поэтому они не могут существовать как элементы в более крупном наборе, если они не заморожены. К счастью, мы можем легко превратить наборы в замороженные наборы, заключив их в функцию frozenset().

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

sentence = "The cat in the hat had two sidekicks, thing one and thing two."
words = sentence.lower().replace('.', '').replace(',', '').split()
vowels = ['a', 'e', 'i', 'o', 'u']
consonants = {frozenset({letter for letter in word if letter not in vowels}) for word in words}

Теперь consonants будет набором замороженных наборов, выглядящих следующим образом:

{frozenset({'t', 'w'}),
 frozenset({'c', 'd', 'k', 's'}),
 frozenset({'c', 't'}),
 frozenset({'n'}),
 frozenset({'g', 'h', 'n', 't'}),
 frozenset({'d', 'h'}),
 frozenset({'h', 't'}),
 frozenset({'d', 'n'})}

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

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

Наслаждаться!