set: Множества в Python
Введение
Множество - это неупорядоченная коллекция уникальных элементов.
Сами множества изменяемы (mutable).
Элементы множества должны быть неизменяемы (immutable).
Чтобы создать множество нужно воспользоваться фигурными скобками {} либо функцией set()
{element1, element2}
Пример
p = {6, 28, 496, 8128, 33550336} print("p: ", p) print("type(p): ", type(p))
p: {33550336, 8128, 496, 6, 28} type(p): <class 'set'>
Создание пустого множества
Так как пустые фигурные скобки создают
словарь
для создания пустого множества используется функция set(). Это произошло по историческим причинам - словари появились
в Python версии 0.9.0 а множества, если верить
wikibooks
только в версии 2.3
Я сам не проверял, но
здесь
можно скачать версию 0.9.1 а
здесь
изучить её код и проверить. Интересная статья на
medium
# Since {} creates empty dict use # set() to created empty set e = set() print("e: ", e) print("type(e): ", type(e))
e: set() type(e): <class 'set'>
Создание множества из списка
При создании множества из списка элементы с повторяющимися значениями удаляются.
# set can be created from a list s = set([2, 4, 16, 64, 4096, 65536, 262144]) print("s: ", s) # it removes duplicates from list t = [1, 4, 2, 1, 7, 9, 9] print("t: ", t) print("set(t): ", set(t))
s: {4096, 64, 2, 65536, 4, 262144, 16} t: [1, 4, 2, 1, 7, 9, 9] set(t): {1, 2, 4, 7, 9}
Итерация по множествам
Множество это итерируемый объект . Его элементы можно перебирать циклом for
# sets are iterable s = {1, 2, 4, 8, 16, 32} for x in s: print(x)
32 1 2 4 8 16
С помощью функции iter() множество можно сделать итератором
# sets are iterable s = {1, 2, 4, 8, 16, 32} it = iter(s) print(next(it)) print(next(it))
32 1
in и not in
# in and not in q = {2, 9, 6, 4} print("q: ", q) print("3 in q: ", 3 in q) print("3 not in q: ", 3 not in q) print("7 in q: ", 7 in q) print("7 not in q: ", 7 not in q)
q: {9, 2, 4, 6} 3 in q: False 3 not in q: True 7 in q: False 7 not in q: True
Добавление элементов во множество
# adding elements k = {81, 108} print("k: ", k) k.add(54) print("k: ", k) k.add(12) print("k: ", k) k.add(108) print("k: ", k) k.update([37, 128, 97]) print("k: ", k)
k: {81, 108} k: {81, 108, 54} k: {81, 108, 12, 54} k: {81, 108, 12, 54} k: {128, 97, 37, 108, 12, 81, 54}
# removing elements # if element is not in set removing it # results in error, try: # k.remove(98) k.discard(98) print("k: ", k) # copy set j = k.copy() # shallow copy print("j: ", j) # algebra blue_eyes = {'Olivia', 'Harry', 'Lilly', 'Jack', 'Amelia'} blond_hair = {'Harry', 'Jack', 'Amelia', 'Mia', 'Joshua'} smell_hcn = {'Harry', 'Amelia'} taste_ptc = {'Harry', 'Lily', 'Amelia', 'Lola'} o_blood = {'Mia', 'Joshua', 'Lily', 'Olivia'} b_blood = {'Amelia', 'Jack'} a_blood = {'Harry'} ab_blood = {'Joshua', 'Lola'} # union print("blue_eyes: ", blue_eyes) print("blond_hair: ", blond_hair) print("blue_eyes.union(blond_hair): ", blue_eyes.union(blond_hair)) print(blue_eyes.union(blond_hair) == blond_hair.union(blue_eyes)) # intersection print("blue_eyes.intersection(blond_hair): ", blue_eyes.intersection(blond_hair)) print(blue_eyes.intersection(blond_hair) == blond_hair.intersection(blue_eyes)) # difference print("blond_hair.difference(blue_eyes): ", blond_hair.difference(blue_eyes)) print(blond_hair.difference(blue_eyes) == blue_eyes.difference(blond_hair)) # False # symmetric difference # it is commutative print("blond_hair.symmetric_difference(blue_eyes): ", blond_hair.symmetric_difference(blue_eyes)) print(blond_hair.symmetric_difference(blue_eyes) == blue_eyes.symmetric_difference(blond_hair)) # True # issubset, issuperset print("blond_hair: ", blond_hair) print("smell_hcn ", smell_hcn) print("smell_hcn.issubset(blond_hair): ", smell_hcn.issubset(blond_hair)) # True print("taste_ptc: ", taste_ptc) print("taste_ptc.issuperset(smell_hcn): ", taste_ptc.issuperset(smell_hcn)) # True # isdisjoint - no members in common print("a_blood: ", a_blood) print("o_blood: ", o_blood) print("a_blood.isdisjoint(o_blood): ", a_blood.isdisjoint(o_blood)) # True
k: {128, 97, 37, 108, 12, 81, 54} j: {128, 97, 81, 37, 54, 108, 12} blue_eyes: {'Lilly', 'Jack', 'Amelia', 'Olivia', 'Harry'} blond_hair: {'Jack', 'Amelia', 'Mia', 'Joshua', 'Harry'} blue_eyes.union(blond_hair): {'Amelia', 'Olivia', 'Lilly', 'Jack', 'Mia', 'Joshua', 'Harry'} True blue_eyes.intersection(blond_hair): {'Jack', 'Amelia', 'Harry'} True blond_hair.difference(blue_eyes): {'Joshua', 'Mia'} False blond_hair.symmetric_difference(blue_eyes): {'Lilly', 'Mia', 'Joshua', 'Olivia'} True blond_hair: {'Jack', 'Amelia', 'Mia', 'Joshua', 'Harry'} smell_hcn {'Amelia', 'Harry'} smell_hcn.issubset(blond_hair): True taste_ptc: {'Lola', 'Lily', 'Amelia', 'Harry'} taste_ptc.issuperset(smell_hcn): True a_blood: {'Harry'} o_blood: {'Mia', 'Olivia', 'Lily', 'Joshua'} a_blood.isdisjoint(o_blood): True
Уникальность элементов
При создании множества нужно учитывать, что некоторые объекты воспринимаются как идентичные и иметь это в виду.
data = {1, True, 1.0} print(len(data))
1