Множества (Set)

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

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

Создание множества в Python

Множество можно создать, заключив разделенные запятыми неизменяемые элементы в фигурные скобки {}. Python также предоставляет метод set(), который можно использовать для создания множества по переданной последовательности.

Пример 1: Использование фигурных скобок

Days = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"}    
print(Days)    
print(type(Days))    
print("looping through the set elements ... ")    
for i in Days:    
    print(i)    

Вывод:

{'Friday', 'Tuesday', 'Monday', 'Saturday', 'Thursday', 'Sunday', 'Wednesday'}
<class 'set'>
looping through the set elements ... 
Friday
Tuesday
Monday
Saturday
Thursday
Sunday
Wednesday

Пример 2: Использование метода set()

Days = set(["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"])    
print(Days)    
print(type(Days))    
print("looping through the set elements ... ")    
for i in Days:    
    print(i)    

Вывод:

{'Friday', 'Wednesday', 'Thursday', 'Saturday', 'Monday', 'Tuesday', 'Sunday'}
<class 'set'>
looping through the set elements ... 
Friday
Wednesday
Thursday
Saturday
Monday
Tuesday
Sunday

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

# Creating a set which have immutable elements  
set1 = {1,2,3, "JavaTpoint", 20.5, 14}  
print(type(set1))  
#Creating a set which have mutable element  
set2 = {1,2,3,["Javatpoint",4]}  
print(type(set2))  

Вывод:

<class 'set'>

Traceback (most recent call last)
<ipython-input-5-9605bb6fbc68> in <module>
      4 
      5 #Creating a set which holds mutable elements
----> 6 set2 = {1,2,3,["Javatpoint",4]}
      7 print(type(set2))

TypeError: unhashable type: 'list'

В приведенном выше коде мы создали два множества, множество set1 содержит неизменяемые элементы, а set2 - один изменяемый элемент в виде списка. При проверке типа set2 возникла ошибка, что означает, что set может содержать только неизменяемые элементы.

Создание пустого множества немного отличается, потому что пустые фигурные скобки {} также используются для создания словаря. Поэтому Python предоставляет метод set(), используемый без аргумента для создания пустого множества.

# Empty curly braces will create dictionary  
set3 = {}  
print(type(set3))  
  
# Empty set using set() function  
set4 = set()  
print(type(set4))  

Вывод:

<class 'dict'>
<class 'set'>

Давайте посмотрим, что произойдет, если мы предоставим дублирующий элемент в множество.

set5 = {1,2,4,4,5,8,9,9,10}  
print("Return set with unique elements:",set5)  

Вывод:

Return set with unique elements: {1, 2, 4, 5, 8, 9, 10}

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

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

Python предоставляет методы add() и update(), которые можно использовать для добавления определенного элемента в набор. Метод add() используется для добавления одного элемента, а метод update() - для добавления нескольких элементов в множество. Рассмотрим следующий пример.

Пример: 1 - Использование метода add()

Months = set(["January","February", "March", "April", "May", "June"])    
print("\nprinting the original set ... ")    
print(months)    
print("\nAdding other months to the set...");    
Months.add("July");    
Months.add ("August");    
print("\nPrinting the modified set...");    
print(Months)    
print("\nlooping through the set elements ... ")    
for i in Months:    
    print(i)    

Вывод:

printing the original set ... 
{'February', 'May', 'April', 'March', 'June', 'January'}

Adding other months to the set...

Printing the modified set...
{'February', 'July', 'May', 'April', 'March', 'August', 'June', 'January'}

looping through the set elements ... 
February
July
May
April
March
August
June
January 

Чтобы добавить более одного элемента в набор, Python предоставляет метод update(). В качестве аргумента он принимает iterable.

Рассмотрим следующий пример.

Пример - 2 Использование функции update()

Months = set(["January","February", "March", "April", "May", "June"])    
print("\nprinting the original set ... ")    
print(Months)    
print("\nupdating the original set ... ")    
Months.update(["July","August","September","October"]);    
print("\nprinting the modified set ... ")     
print(Months);  

Вывод:

printing the original set ... 
{'January', 'February', 'April', 'May', 'June', 'March'}

updating the original set ... 
printing the modified set ... 
{'January', 'February', 'April', 'August', 'October', 'May', 'June', 'July', 'September', 'March'}

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

Python предоставляет метод discard() и метод remove(), которые можно использовать для удаления элементов из множества. Разница между этими функциями заключается в том, что при использовании функции discard(), если элемент не существует в наборе, то множество останется неизменным, в то время как метод remove() выдаст ошибку.

Рассмотрим следующий пример.

Пример-1 Использование метода discard()

months = set(["January","February", "March", "April", "May", "June"])    
print("\nprinting the original set ... ")    
print(months)    
print("\nRemoving some months from the set...");    
months.discard("January");    
months.discard("May");    
print("\nPrinting the modified set...");    
print(months)    
print("\nlooping through the set elements ... ")    
for i in months:    
    print(i)    

Вывод:

printing the original set ... 
{'February', 'January', 'March', 'April', 'June', 'May'}

Removing some months from the set...

Printing the modified set...
{'February', 'March', 'April', 'June'}

looping through the set elements ... 
February
March
April
June

Python также предоставляет метод remove() для удаления элемента из набора. Рассмотрим следующий пример удаления элементов с помощью метода remove().

Пример-2 Использование функции remove()

months = set(["January","February", "March", "April", "May", "June"])    
print("\nprinting the original set ... ")    
print(months)    
print("\nRemoving some months from the set...");    
months.remove("January");    
months.remove("May");    
print("\nPrinting the modified set...");    
print(months)

Вывод:

printing the original set ... 
{'February', 'June', 'April', 'May', 'January', 'March'}

Removing some months from the set...

Printing the modified set...
{'February', 'June', 'April', 'March'}

Мы также можем использовать метод pop() для удаления элемента. Как правило, метод pop() всегда удаляет последний элемент, но набор неупорядочен, и мы не можем определить, какой элемент будет удален из множества.

Рассмотрим следующий пример удаления элемента из множества с помощью метода pop().

Months = set(["January","February", "March", "April", "May", "June"])    
print("\nprinting the original set ... ")    
print(Months)    
print("\nRemoving some months from the set...");    
Months.pop();    
Months.pop();    
print("\nPrinting the modified set...");    
print(Months)    

Вывод:

printing the original set ... 
{'June', 'January', 'May', 'April', 'February', 'March'}

Removing some months from the set...

Printing the modified set...
{'May', 'April', 'February', 'March'}

В приведенном выше коде последним элементом множества Month является March, но метод pop() удалил June и January, потому что набор неупорядочен и метод pop() не смог определить последний элемент набора.

Python предоставляет метод clear() для удаления всех элементов из набора.

Рассмотрим следующий пример.

Months = set(["January","February", "March", "April", "May", "June"])    
print("\nprinting the original set ... ")    
print(Months)    
print("\nRemoving all the items from the set...");    
Months.clear()    
print("\nPrinting the modified set...")    
print(Months)    

Вывод:

printing the original set ... 
{'January', 'May', 'June', 'April', 'March', 'February'}

Removing all the items from the set...

Printing the modified set...
set()

Разница между методами discard() и remove()

Несмотря на то, что метод discard() и remove() выполняют одну и ту же задачу, между discard() и remove() есть одно основное различие.

Если ключ, который нужно удалить из множества с помощью метода discard(), не существует в множестве, Python не выдаст ошибку. Программа сохраняет свой поток управления.

С другой стороны, если элемент, который нужно удалить из множества с помощью remove(), не существует в наборе, Python выдаст ошибку.

Рассмотрим следующий пример.

Months = set(["January","February", "March", "April", "May", "June"])    
print("\nprinting the original set ... ")    
print(Months)    
print("\nRemoving items through discard() method...");    
Months.discard("Feb"); #will not give an error although the key feb is not available in the set    
print("\nprinting the modified set...")    
print(Months)    
print("\nRemoving items through remove() method...");    
Months.remove("Jan") #will give an error as the key jan is not available in the set.     
print("\nPrinting the modified set...")    
print(Months)    

Вывод:

printing the original set ... 
{'March', 'January', 'April', 'June', 'February', 'May'}

Removing items through discard() method...

printing the modified set...
{'March', 'January', 'April', 'June', 'February', 'May'}

Removing items through remove() method...
Traceback (most recent call last):
  File "set.py", line 9, in 
    Months.remove("Jan")
KeyError: 'Jan'

Операции с множествами в Python

С множеством можно выполнять такие математические операции, как объединение, пересечение, разность и симметричная разность. Python предоставляет возможность выполнять эти операции с помощью операторов или методов.

Объединение двух множеств в Python

Объединение двух множеств вычисляется с помощью оператора pipe (|). Объединение двух множеств содержит все элементы, которые присутствуют в обоих множествах.

Объединение двух множеств в Python

Рассмотрим следующий пример для вычисления объединения двух множеств.

Пример 1: использование оператора union |

Days1 = {"Monday","Tuesday","Wednesday","Thursday", "Sunday"}    
Days2 = {"Friday","Saturday","Sunday"}    
print(Days1|Days2) #printing the union of the sets   

Вывод:

{'Friday', 'Sunday', 'Saturday', 'Tuesday', 'Wednesday', 'Monday', 'Thursday'}

Python также предоставляет метод union(), который также можно использовать для вычисления объединения двух множеств. Рассмотрим следующий пример.

Пример 2: использование метода union()

Days1 = {"Monday","Tuesday","Wednesday","Thursday"}    
Days2 = {"Friday","Saturday","Sunday"}    
print(Days1.union(Days2)) #printing the union of the sets     

Вывод:

{'Friday', 'Monday', 'Tuesday', 'Thursday', 'Wednesday', 'Sunday', 'Saturday'}

Пересечение двух множеств в Python

Пересечение двух множеств может быть выполнено с помощью оператора & или функции intersection(). Пересечение двух множеств задается как набор элементов, общих для обоих множеств.

Пересечение двух множеств в Python

Пример 1: Использование оператора &

Days1 = {"Monday","Tuesday", "Wednesday", "Thursday"}    
Days2 = {"Monday","Tuesday","Sunday", "Friday"}    
print(Days1&Days2) #prints the intersection of the two sets    

Вывод:

{'Monday', 'Tuesday'}

Пример 2: Использование метода intersection()

set1 = {"Devansh","John", "David", "Martin"}    
set2 = {"Steve", "Milan", "David", "Martin"}    
print(set1.intersection(set2)) #prints the intersection of the two sets    

Вывод:

{'Martin', 'David'}

Пример 3

set1 = {1,2,3,4,5,6,7}  
set2 = {1,2,20,32,5,9}  
set3 = set1.intersection(set2)  
print(set3)  

Вывод:

{1,2,5}

Метод intersection_update()

Метод intersection_update() удаляет из исходного множества элементы, которые не присутствуют в обоих множествах (во всех наборах, если задано несколько).

Метод intersection_update() отличается от метода intersection(), поскольку он изменяет исходное множество, удаляя ненужные элементы, с другой стороны, метод intersection() возвращает новое множество.

Рассмотрим следующий пример.

a = {"Devansh", "bob", "castle"}    
b = {"castle", "dude", "emyway"}    
c = {"fuson", "gaurav", "castle"}    
    
a.intersection_update(b, c)    
    
print(a)    

Вывод:

{'castle'}

Нахождение разности двух множеств в Python

Разность двух множеств можно вычислить с помощью оператора вычитания (-) или метода intersection(). Допустим, есть два множества A и B, а разность равна A-B, что означает, что в результирующем множестве будет получен тот элемент из A, которого нет в множестве B.

Нахождение разности двух множеств в Python

Пример 1: Использование оператора вычитания (-)

Days1 = {"Monday",  "Tuesday", "Wednesday", "Thursday"}    
Days2 = {"Monday", "Tuesday", "Sunday"}    
print(Days1-Days2) #{"Wednesday", "Thursday" will be printed}    

Вывод:

{'Thursday', 'Wednesday'}

Пример 2 : Использование метода difference()

Вывод:

{'Thursday', 'Wednesday'}

Симметричная разность двух множеств в Python

Симметричная разность двух множеств вычисляется с помощью оператора ^ или метода symmetric_difference(). Симметричная разность множеств, удаляет тот элемент, который присутствует в обоих множествах. Рассмотрим следующий пример:

Симметричная разность двух множеств в Python

Пример - 1: Использование оператора ^

a = {1,2,3,4,5,6}  
b = {1,2,9,8,10}  
c = a^b  
print(c)  

Вывод:

{3, 4, 5, 6, 8, 9, 10}

Пример - 2: Использование метода symmetric_difference()

a = {1,2,3,4,5,6}  
b = {1,2,9,8,10}  
c = a.symmetric_difference(b)  
print(c)  

Вывод:

{3, 4, 5, 6, 8, 9, 10}

Сравнение множеств

Python позволяет нам использовать операторы сравнения, т.е. <, >, <=, >=, == с множествами, с помощью которых мы можем проверить, является ли множество подмножеством, супермножеством или эквивалентным другому множеству. В зависимости от элементов, присутствующих внутри множества, возвращается булево значение true или false.

Рассмотрим следующий пример.

Days1 = {"Monday",  "Tuesday", "Wednesday", "Thursday"}    
Days2 = {"Monday", "Tuesday"}    
Days3 = {"Monday", "Tuesday", "Friday"}    
    
#Days1 is the superset of Days2 hence it will print true.     
print (Days1>Days2)     
    
#prints false since Days1 is not the subset of Days2     
print (Days1<Days2)    
    
#prints false since Days2 and Days3 are not equivalent     
print (Days2 == Days3)    

Вывод:

True
False
False

Замороженные множества (FrozenSets) в Python

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

Элементы замороженного множества не могут быть изменены после создания. Мы не можем изменять или добавлять содержимое замороженных наборов с помощью таких методов, как add() или remove().

Метод frozenset() используется для создания объекта frozenset. В этот метод передается итерируемая последовательность, которая преобразуется в замороженный набор в качестве возвращаемого типа метода.

Для создания замороженного набора рассмотрим следующий пример.

Frozenset = frozenset([1,2,3,4,5])     
print(type(Frozenset))    
print("\nprinting the content of frozen set...")    
for i in Frozenset:    
    print(i);    
Frozenset.add(6) #gives an error since we cannot change the content of Frozenset after c

Вывод:

<class 'frozenset'>

printing the content of frozen set...
1
2
3
4
5
Traceback (most recent call last):
  File "set.py", line 6, in <module>
    Frozenset.add(6) #gives an error since we can change the content of Frozenset after creation 
AttributeError: 'frozenset' object has no attribute 'add'

Замороженные множества (FrozenSets) для словаря

Если передать словарь в качестве последовательности в метод frozenset(), то он возьмет только ключи из словаря и вернет frozenset, который содержит ключи словаря в качестве своих элементов.

Рассмотрим следующий пример.

Dictionary = {"Name":"John", "Country":"USA", "ID":101}     
print(type(Dictionary))    
Frozenset = frozenset(Dictionary); #Frozenset will contain the keys of the dictionary    
print(type(Frozenset))    
for i in Frozenset:     
    print(i)    

Вывод:

<class 'dict'>
<class 'frozenset'>
Name
Country
ID

Примеры мрограмм с использование множеств

Пример - 1: Напишите программу для удаления заданного числа из набора.

my_set = {1,2,3,4,5,6,12,24}  
n = int(input("Enter the number you want to remove"))  
my_set.discard(n)  
print("After Removing:",my_set)  

Вывод:

Enter the number you want to remove:12
After Removing: {1, 2, 3, 4, 5, 6, 24}

Пример - 2: Напишите программу для добавления нескольких элементов к множеству.

set1 = set([1,2,4,"John","CS"])  
set1.update(["Apple","Mango","Grapes"])  
print(set1)  

Вывод:

{1, 2, 4, 'Apple', 'John', 'CS', 'Mango', 'Grapes'}

Пример - 3: Напишите программу для нахождения объединения двух множеств.

set1 = set(["Peter","Joseph", 65,59,96])  
set2  = set(["Peter",1,2,"Joseph"])  
set3 = set1.union(set2)  
print(set3)  

Вывод:

{96, 65, 2, 'Joseph', 1, 'Peter', 59}

Пример - 4: Напишите программу для нахождения пересечения двух множеств.

set1 = {23,44,56,67,90,45,"Javatpoint"}  
set2 = {13,23,56,76,"Sachin"}  
set3 = set1.intersection(set2)  
print(set3)  

Вывод:

{56, 23}

Пример - 5: Напишите программу для добавления элемента в морозильную установку.

set1 = {23,44,56,67,90,45,"Javatpoint"}  
set2 = {13,23,56,76,"Sachin"}  
set3 = set1.intersection(set2)  
print(set3)  

Вывод:

TypeError: 'frozenset' object does not support item assignment

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

Пример - 6: Напишите программу для нахождения issuperset, issubset и superset.

set1 = set(["Peter","James","Camroon","Ricky","Donald"])  
set2 = set(["Camroon","Washington","Peter"])  
set3 = set(["Peter"])  
  
issubset = set1 >= set2  
print(issubset)  
issuperset = set1 <= set2  
print(issuperset)  
issubset = set3 <= set2  
print(issubset)  
issuperset = set2 >= set3  
print(issuperset)  

Вывод:

False
False
True
True

Встроенные методы множеств в Python

Python содержит следующие методы для использования с множествами.

Метод Описание
add(item) Добавляет элемент в множество. Не имеет эффекта, если элемент уже присутствует в множестве.
clear() Удаляет все элементы из множества.
copy() Возвращает неглубокую копию множества.
difference_update(....) Изменяет множество, удаляя все элементы, которые также присутствуют в других указанных множествах.
discard(item) Удаляет указанный элемент из множества.
intersection() Возвращает новое множество, содержащее только общие элементы обоих множеств. (всех множеств, если указано более двух).
intersection_update(....) Удаляет элементы из исходного множества, которые не присутствуют в обоих множествах (во всех множествах, если указано несколько).
isdisjoint(....) Возвращает True, если два множества имеют нулевое пересечение.
issubset(....) Сообщает, содержит ли другое множество указанный набор.
issuperset(....) Сообщает, содержит ли указаннное множество другой набор.
pop() Удаляет и возвращает произвольный элемент множества, который является последним элементом множества. Вызывает KeyError, если множество пустое.
remove(item) Удаляет элемент из множества; он должен быть его членом. Если элемент не является членом множества, то возвращает KeyError.
symmetric_difference(....) Возвращется элементы, которые есть в двух множествах (в одном или другом, но не в обоих)
symmetric_difference_update(....) Возвращает новое множество, содержащее симметричную разность двух множеств.
union(....) Возвращает объединение множеств в виде нового множества (т.е. все элементы, которые есть в любом из множеств).
update() Выполняет объединение всех задействованных множеств и обновляет множество, для которого он вызывается. Он добавляет все члены набора аргументов в множеств, для которого он вызывается.

списки (list) vs кортежи (typle)

словарь (dictionary)