Установить понимание в 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, поэтому у вас должно быть все необходимое, чтобы иметь возможность исследовать все виды приложений для этого инструмента.
Наслаждаться!