Программирование на Python

Множества

Разбить на страницы
Показывать лекцию целиком

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

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

Элементы множества могут иметь разные типы - числа, строки, но не могут быть словарями, множествами или списками. Такое ограничение связано с особенностью хранения элементов множества, как хешируемых объектов. Хеширование означает, что существует некоторая хеш-функция, которая по значению объекта определяет его ключ, задающий местоположение объекта. Словари, множества, списки не являются хешируемыми объектами.

Пример:

#Примеры работы с типом данных - множество (class set)
def test1():
    #множества
    #задание множества
    s = {5, 1, 3, 3, 5, 1}
    print ("s = ", s, "Type(s) = ", type(s))
    sv = {5, 7.5, 'set'}
    print ("множество с элементами разного типа = ", sv) 
test1()

Результат работы:

Конструирование множества. Метод set

Метод set применим к итерируемым объектам - потомкам последовательности - к спискам, к строкам, но не к словарям. Метод преобразует объект, заданный в качестве аргумента, в множество, удаляя повторяющиеся значения объекта аргумента.

Пример:

def test2():
    # метод set - приведение к типу set
    str = "this is a string" 
    set_str = set(str)
    print("str = ", str, "set_str = ", set_str)
    list =[5, 7, 9, 5, 3, 1, 7, 9]
    set_list = set(list)
    print("list = ", list, "set_list = ", set_list)
test2()

Результат:

Заметьте, порядок расположения элементов множества задается неизвестной пользователю хеш-функцией.

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

Над множествами определены основные операции: объединение (|), пересечение () , разность (-). Операции соответствуют операциям над множествами, принятыми в математике, и имеют тот же смысл. Операции хороши тем, что позволяют строить выражения над множествами. Приоритеты операций при вычислении выражения также соответствуют общепринятым правилам. Операция пересечения множеств, воспринимаемая как умножение, имеет более высокий приоритет и выполняется раньше, чем операции разности и объединения, воспринимаемые как операции сложения.

Пример:

def test3():
    #операции над множествами
    f = set('папа')
    m = set('мама')
    s = f |  m #объединение
    d = f  m #пересечение
    v = f - m #разность
    r = m -f # f-m ~= m -f
    expression = (set("декабрь") - set("январь") - set("февраль") | 
    set("март")  set("апрель")  set("май"))
    print('f = ', f )
    print('m = ', m )
    print('f | m = ', s )
    print('f  m = ', d )
    print('f - m = ', v )
    print ('m - f = ', r)
    print(expression) 
test3()

Результаты работы:

Методы для работы с множествами

Операциям (|, , -), определенным над множествами, соответствуют эквивалентные методы - union, intersection, difference. Набор методов шире набора операций. Метод symmetric_difference задает симметрическую разность. Для множеств a, b симметрическая разность представляет объединение двух разностей: a - b и b - a. Методы union, intersection, difference являются функциями, возвращающими значение. Эти методы имеют двойников - union_update, intersection_update, difference_update, которые являются процедурами, обновляющими значение объекта, вызвавшего метод. Процедурой является и метод update, который создает объединение объекта, вызвавшего метод, и аргумента метода.

Пример:

def test4():
    # методы над множествами
    f = set('папа')
    m = set('мама')
    print('f = ', f )
    print('m = ', m )
    s = f.union(m)           #объединение
    d = f.intersection(m)    #пересечение
    v = f.difference(m)      #разность f - m
    r = m.difference(f)      #разность m - f
    w = f.symmetric_difference(m) #симметрическая разность
    print('объединение f и m = ', s )
    print('пересечение f и m = ', d )
    print('разность f и m = ', v )
    print ('разность m и f = ', r)
    print ('симметрическая разность m и f = ', w)
    f.update(['д','о', 'м'])         #обновление f, объединением со списком
    s.intersection_update(set("март"))
    print('обновление f, = ', f)
    print('обновление s, = ', s )
test4()
 

Результат:

Операции над элементами множества. Добавление и удаление элементов, принадлежность элемента множеству.

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

Метод add добавляет элемент в множество.

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

Метод remove удаляет указанный элемент из множества. Если указанного элемента в множестве нет, то при вызове метода remove возникнет ошибка. Поэтому, если нет уверенности в существовании элемента, вызову метода remove должна предшествовать проверка на существование элемента. Эта проверка выполняется, как обычно, операцией in.

Пример:

def test5():
    #методы работы с элементами множества
    m = set("март")
    print(m) 
    m.add("о")
    print(m)
    m.update(set("апрель"), [1, 2, 3])
    print(m)
    #удаление элементов
    m.remove(2)
    print(m)
    item = m.pop()
    print(item)
    if "а" in m:
        m.remove("а")
    print(m) 
test5()

Результат:

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

Каждое конечное множество из n элементов имеет 2n подмножеств. Множество всех подмножеств множества А включает пустое множество и само множество А в качестве своих подмножеств. Если множество В является подмножеством множества А, то А является надмножеством для множества В. Множество А является своим подмножеством и своим надмножеством.

Метод set(), вызванный без аргументов возвращает в качестве результата пустое множество. Заметьте, что константа {} не задает пустое множество, - она задает пустой словарь, не содержащий элементов. Метод issubset позволяет проверить, является ли одно множество подмножеством другого множества. Метод issuperset позволяет проверить, является ли одно множество надмножеством другого множества. Эти операции позволяют проверить эквивалентность множеств и играют важную роль в задачах, где полезно применять множества в качестве структур данных.

Пример:

def test6():
    #методы работы с подмножествами и надмножествами
    m = set("март")
    m.add('о')
    m.add('с')
    print(m)
    if m.issubset(set('матрос'))  m.issuperset(set('марс')):
        print('подмножество и надмножество')
    s = set('столь')
    s.remove('т')
    print(s)
    v = set('лось')
    if s.issubset(v)  v.issubset(s):
        print('множества эквивалентны')
    if set().issubset(set("Anyset")):
        print("Пустое множество является подмножеством любого множества")
test6()

Результат работы:

Итоги

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

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

Страницы:

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

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

Элементы множества могут иметь разные типы - числа, строки, но не могут быть словарями, множествами или списками. Такое ограничение связано с особенностью хранения элементов множества, как хешируемых объектов. Хеширование означает, что существует некоторая хеш-функция, которая по значению объекта определяет его ключ, задающий местоположение объекта. Словари, множества, списки не являются хешируемыми объектами.

Пример:

#Примеры работы с типом данных - множество (class set)
def test1():
    #множества
    #задание множества
    s = {5, 1, 3, 3, 5, 1}
    print ("s = ", s, "Type(s) = ", type(s))
    sv = {5, 7.5, 'set'}
    print ("множество с элементами разного типа = ", sv) 
test1()

Результат работы:

Конструирование множества. Метод set

Метод set применим к итерируемым объектам - потомкам последовательности - к спискам, к строкам, но не к словарям. Метод преобразует объект, заданный в качестве аргумента, в множество, удаляя повторяющиеся значения объекта аргумента.

Пример:

def test2():
    # метод set - приведение к типу set
    str = "this is a string" 
    set_str = set(str)
    print("str = ", str, "set_str = ", set_str)
    list =[5, 7, 9, 5, 3, 1, 7, 9]
    set_list = set(list)
    print("list = ", list, "set_list = ", set_list)
test2()

Результат:

Заметьте, порядок расположения элементов множества задается неизвестной пользователю хеш-функцией.

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

Над множествами определены основные операции: объединение (|), пересечение () , разность (-). Операции соответствуют операциям над множествами, принятыми в математике, и имеют тот же смысл. Операции хороши тем, что позволяют строить выражения над множествами. Приоритеты операций при вычислении выражения также соответствуют общепринятым правилам. Операция пересечения множеств, воспринимаемая как умножение, имеет более высокий приоритет и выполняется раньше, чем операции разности и объединения, воспринимаемые как операции сложения.

Пример:

def test3():
    #операции над множествами
    f = set('папа')
    m = set('мама')
    s = f |  m #объединение
    d = f  m #пересечение
    v = f - m #разность
    r = m -f # f-m ~= m -f
    expression = (set("декабрь") - set("январь") - set("февраль") | 
    set("март")  set("апрель")  set("май"))
    print('f = ', f )
    print('m = ', m )
    print('f | m = ', s )
    print('f  m = ', d )
    print('f - m = ', v )
    print ('m - f = ', r)
    print(expression) 
test3()

Результаты работы:

Методы для работы с множествами

Операциям (|, , -), определенным над множествами, соответствуют эквивалентные методы - union, intersection, difference. Набор методов шире набора операций. Метод symmetric_difference задает симметрическую разность. Для множеств a, b симметрическая разность представляет объединение двух разностей: a - b и b - a. Методы union, intersection, difference являются функциями, возвращающими значение. Эти методы имеют двойников - union_update, intersection_update, difference_update, которые являются процедурами, обновляющими значение объекта, вызвавшего метод. Процедурой является и метод update, который создает объединение объекта, вызвавшего метод, и аргумента метода.

Пример:

def test4():
    # методы над множествами
    f = set('папа')
    m = set('мама')
    print('f = ', f )
    print('m = ', m )
    s = f.union(m)           #объединение
    d = f.intersection(m)    #пересечение
    v = f.difference(m)      #разность f - m
    r = m.difference(f)      #разность m - f
    w = f.symmetric_difference(m) #симметрическая разность
    print('объединение f и m = ', s )
    print('пересечение f и m = ', d )
    print('разность f и m = ', v )
    print ('разность m и f = ', r)
    print ('симметрическая разность m и f = ', w)
    f.update(['д','о', 'м'])         #обновление f, объединением со списком
    s.intersection_update(set("март"))
    print('обновление f, = ', f)
    print('обновление s, = ', s )
test4()
 

Результат:

Операции над элементами множества. Добавление и удаление элементов, принадлежность элемента множеству.

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

Метод add добавляет элемент в множество.

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

Метод remove удаляет указанный элемент из множества. Если указанного элемента в множестве нет, то при вызове метода remove возникнет ошибка. Поэтому, если нет уверенности в существовании элемента, вызову метода remove должна предшествовать проверка на существование элемента. Эта проверка выполняется, как обычно, операцией in.

Пример:

def test5():
    #методы работы с элементами множества
    m = set("март")
    print(m) 
    m.add("о")
    print(m)
    m.update(set("апрель"), [1, 2, 3])
    print(m)
    #удаление элементов
    m.remove(2)
    print(m)
    item = m.pop()
    print(item)
    if "а" in m:
        m.remove("а")
    print(m) 
test5()

Результат:

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

Каждое конечное множество из n элементов имеет 2n подмножеств. Множество всех подмножеств множества А включает пустое множество и само множество А в качестве своих подмножеств. Если множество В является подмножеством множества А, то А является надмножеством для множества В. Множество А является своим подмножеством и своим надмножеством.

Метод set(), вызванный без аргументов возвращает в качестве результата пустое множество. Заметьте, что константа {} не задает пустое множество, - она задает пустой словарь, не содержащий элементов. Метод issubset позволяет проверить, является ли одно множество подмножеством другого множества. Метод issuperset позволяет проверить, является ли одно множество надмножеством другого множества. Эти операции позволяют проверить эквивалентность множеств и играют важную роль в задачах, где полезно применять множества в качестве структур данных.

Пример:

def test6():
    #методы работы с подмножествами и надмножествами
    m = set("март")
    m.add('о')
    m.add('с')
    print(m)
    if m.issubset(set('матрос'))  m.issuperset(set('марс')):
        print('подмножество и надмножество')
    s = set('столь')
    s.remove('т')
    print(s)
    v = set('лось')
    if s.issubset(v)  v.issubset(s):
        print('множества эквивалентны')
    if set().issubset(set("Anyset")):
        print("Пустое множество является подмножеством любого множества")
test6()

Результат работы:

Итоги

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

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

Вернуться к учебному плану