Python забяспечвае ўбудаваны тып дадзеных set, які апрацоўвае наборы.
Набор тыпаў уяўляе сабой набор элементаў, якія не паўтараюцца (элементы, якія не аднолькавыя па значэнні, унікальныя элементы) і можа выконваць аперацыі з наборамі, такія як набор аб’яднанняў, набор прадуктаў і набор рознасці.
У гэтым раздзеле асноўныя аперацыі ў аперацыях з наборамі тлумачацца з прыкладам кода.
- Стварэнне наборных аб’ектаў:
{}
,set()
- задаць абазначэнне ўключэння
- Колькасць элементаў у наборы:
len()
- Даданне элемента ў набор:
add()
- Выдаліць элемент з набору:
discard()
,remove()
,pop()
,clear()
- Wasset (зліццё, аб’яднанне):|аператар,
union()
- Наборы прадуктаў (агульныя часткі, скрыжаванні, скрыжаванні):& аператар,
intersection()
- адноснае дапаўненне:-аператар,
difference()
- розніца сіметрыі мноства:^ аператар,
symmetric_difference()
- падмноства ці не:<= аператар,
issubset()
- Верхні набор ці не:>= аператар,
issuperset()
- Вызначэнне таго, з’яўляюцца яны ўзаемна простымі ці не:
isdisjoint()
Тып набору – гэта зменлівы тып, які можа дадаваць і выдаляць элементы, а таксама ёсць тып замарожанага набора, які мае тую ж аперацыю набору і іншыя метады, што і тып набору, але з’яўляецца нязменным (не можа быць зменены шляхам дадання, выдалення або змены элементаў іншым чынам ).
- Стварэнне аб’екта набору::{},set()
- задаць абазначэнне ўключэння
- Колькасць элементаў у наборы:len()
- Даданне элемента ў набор:add()
- Выдаліць элемент з набору:discard(),remove(),pop(),clear()
- Wasset (зліццё, аб’яднанне):|аператар,union()
- Наборы прадуктаў (агульныя часткі, скрыжаванні, скрыжаванні):& аператар,intersection()
- адноснае дапаўненне:-аператар,difference()
- розніца сіметрыі мноства:^ аператар,symmetric_difference()
- падмноства ці не:<= аператар,issubset()
- Верхні набор ці не:>= аператар,issuperset()
- Вызначэнне таго, з’яўляюцца яны ўзаемна простымі ці не:isdisjoint()
Стварэнне аб’екта набору::{},set()
Ствараецца хвалевымі дужкамі {}
Аб’екты з наборам тыпаў могуць быць створаны, заключаючы элементы ў дужкі {}.
Калі ёсць паўтаральныя значэнні, яны ігнаруюцца, і ў якасці элементаў застаюцца толькі унікальныя значэнні.
s = {1, 2, 2, 3, 1, 4}
print(s)
print(type(s))
# {1, 2, 3, 4}
# <class 'set'>
У якасці элементаў можна мець розныя тыпы. Аднак аб’екты, якія можна абнаўляць, напрыклад тыпы спісаў, не могуць быць зарэгістраваныя. Картэжы дапускаюцца.
Акрамя таго, паколькі тыпы набораў не ўпарадкаваны, парадак, у якім яны генерыруюцца, не захоўваецца.
s = {1.23, 'abc', (0, 1, 2), 'abc'}
print(s)
# {(0, 1, 2), 1.23, 'abc'}
# s = {[0, 1, 2]}
# TypeError: unhashable type: 'list'
Розныя тыпы, такія як int і float, лічацца дублікатамі, калі іх значэнні эквівалентныя.
s = {100, 100.0}
print(s)
# {100}
Паколькі пустая дужка {} лічыцца тыпам слоўніка, аб’ект тыпу пусты набор (пусты набор) можа быць створаны з дапамогай канструктара, апісанага далей.
s = {}
print(s)
print(type(s))
# {}
# <class 'dict'>
Створаны канструктарам set()
Аб’екты тыпу set могуць быць створаны таксама з дапамогай канструктара set().
Вызначэнне ітэрацыйнага аб’екта, такога як спіс або картэж, у якасці аргумента генеруе аб’ект набора, элементы якога з’яўляюцца толькі унікальнымі значэннямі, з выключэннем дублікатаў элементаў.
l = [1, 2, 2, 3, 1, 4]
print(l)
print(type(l))
# [1, 2, 2, 3, 1, 4]
# <class 'list'>
s_l = set(l)
print(s_l)
print(type(s_l))
# {1, 2, 3, 4}
# <class 'set'>
Нязменныя тыпы frozenset ствараюцца з дапамогай канструктара frozenset().
fs_l = frozenset(l)
print(fs_l)
print(type(fs_l))
# frozenset({1, 2, 3, 4})
# <class 'frozenset'>
Калі аргумент апушчаны, ствараецца пусты аб’ект тыпу набора (пусты набор).
s = set()
print(s)
print(type(s))
# set()
# <class 'set'>
Паўторныя элементы можна выдаліць са спісу або картэжа з дапамогай set(), але парадак зыходнага спісу не захоўваецца.
Каб пераўтварыць тып набору ў спіс або картэж, выкарыстоўвайце list(),tuple().
l = [2, 2, 3, 1, 3, 4]
l_unique = list(set(l))
print(l_unique)
# [1, 2, 3, 4]
Глядзіце наступны артыкул для атрымання інфармацыі аб выдаленні паўтаральных элементаў пры захаванні парадку, здабыванні толькі паўтаральных элементаў і апрацоўцы паўтаральных элементаў у двухмерным масіве (спіс спісаў).
задаць абазначэнне ўключэння
Акрамя разумення спісу, ёсць і ўсталяваныя разуменні. Проста заменіце квадратныя дужкі [] на дужкі {} у спісах.
s = {i**2 for i in range(5)}
print(s)
# {0, 1, 4, 9, 16}
Глядзіце наступны артыкул для атрымання дадатковай інфармацыі аб абазначэнні разумення спісу.
Колькасць элементаў у наборы:len()
Колькасць элементаў у наборы можна атрымаць з дапамогай убудаванай функцыі len().
s = {1, 2, 2, 3, 1, 4}
print(s)
print(len(s))
# {1, 2, 3, 4}
# 4
Калі вы хочаце падлічыць колькасць элементаў у кожным спісе, у якім ёсць элементы з паўтаральнымі значэннямі і г.д., глядзіце наступны артыкул.
Даданне элемента ў набор:add()
Каб дадаць элемент у набор, выкарыстоўвайце метад add().
s = {0, 1, 2}
s.add(3)
print(s)
# {0, 1, 2, 3}
Выдаліць элемент з набору:discard(),remove(),pop(),clear()
Каб выдаліць элемент з набору, выкарыстоўвайце метады discard(), remove(), pop() і clear().
Метад discard() выдаляе элемент, указаны ў аргументе. Калі зададзена значэнне, якое не існуе ў наборы, нічога не робіцца.
s = {0, 1, 2}
s.discard(1)
print(s)
# {0, 2}
s = {0, 1, 2}
s.discard(10)
print(s)
# {0, 1, 2}
Метад remove() таксама выдаляе элемент, названы ў аргументы, але вяртаецца памылка KeyError, калі вызначана значэнне, якое не існуе ў наборы.
s = {0, 1, 2}
s.remove(1)
print(s)
# {0, 2}
# s = {0, 1, 2}
# s.remove(10)
# KeyError: 10
Метад pop() выдаляе элементы з набору і вяртае іх значэнні. Немагчыма выбраць, якія значэнні выдаліць. Пусты набор прывядзе да памылкі KeyError.
s = {2, 1, 0}
v = s.pop()
print(s)
print(v)
# {1, 2}
# 0
s = {2, 1, 0}
print(s.pop())
# 0
print(s.pop())
# 1
print(s.pop())
# 2
# print(s.pop())
# KeyError: 'pop from an empty set'
Метад clear() выдаляе ўсе элементы і робіць набор пустым.
s = {0, 1, 2}
s.clear()
print(s)
# set()
Wasset (зліццё, аб’яднанне):|аператар,union()
Набор аб’яднанняў (зліццё, аб’яднанне) можна атрымаць з дапамогай | аператар або метад union().
s1 = {0, 1, 2}
s2 = {1, 2, 3}
s3 = {2, 3, 4}
s_union = s1 | s2
print(s_union)
# {0, 1, 2, 3}
s_union = s1.union(s2)
print(s_union)
# {0, 1, 2, 3}
Для метаду можна задаць некалькі аргументаў. У дадатак да тыпу набору, спісы і картэжы, якія могуць быць пераўтвораны ў тып набору з дапамогай set(), таксама могуць быць вызначаны ў якасці аргументаў. Тое ж самае тычыцца наступных аператараў і метадаў.
s_union = s1.union(s2, s3)
print(s_union)
# {0, 1, 2, 3, 4}
s_union = s1.union(s2, [5, 6, 5, 7, 5])
print(s_union)
# {0, 1, 2, 3, 5, 6, 7}
Наборы прадуктаў (агульныя часткі, скрыжаванні, скрыжаванні):& аператар,intersection()
Набор прадуктаў (агульная частка, скрыжаванне і скрыжаванне) можна атрымаць з дапамогай & аператар або метад intersection().
s_intersection = s1 & s2
print(s_intersection)
# {1, 2}
s_intersection = s1.intersection(s2)
print(s_intersection)
# {1, 2}
s_intersection = s1.intersection(s2, s3)
print(s_intersection)
# {2}
адноснае дапаўненне:-аператар,difference()
Набор розніцы можна атрымаць з дапамогай аператара – або метаду розніцы().
s_difference = s1 - s2
print(s_difference)
# {0}
s_difference = s1.difference(s2)
print(s_difference)
# {0}
s_difference = s1.difference(s2, s3)
print(s_difference)
# {0}
розніца сіметрыі мноства:^ аператар,symmetric_difference()
Сіметрычны набор розніцы (набор элементаў, які змяшчаецца толькі ў адным з двух) можна атрымаць з дапамогай аператара ^ або symmetric_difference().
Эквівалент выключнай дыз’юнкцыі (XOR) у лагічных аперацыях.
s_symmetric_difference = s1 ^ s2
print(s_symmetric_difference)
# {0, 3}
s_symmetric_difference = s1.symmetric_difference(s2)
print(s_symmetric_difference)
# {0, 3}
падмноства ці не:<= аператар,issubset()
Каб вызначыць, ці з’яўляецца набор падмноствам іншага набору, выкарыстоўвайце аператар <= або метад issubset().
s1 = {0, 1}
s2 = {0, 1, 2, 3}
print(s1 <= s2)
# True
print(s1.issubset(s2))
# True
І аператар <=, і метад issubset() вяртаюць праўду для эквівалентных набораў.
Каб вызначыць, ці з’яўляецца гэта сапраўдным падмноствам, выкарыстоўвайце аператар <=, які вяртае ілжыва для эквівалентных набораў.
print(s1 <= s1)
# True
print(s1.issubset(s1))
# True
print(s1 < s1)
# False
Верхні набор ці не:>= аператар,issuperset()
Каб вызначыць, ці з’яўляецца адзін набор надмноствам іншага, выкарыстоўвайце аператар >= або issuperset().
s1 = {0, 1}
s2 = {0, 1, 2, 3}
print(s2 >= s1)
# True
print(s2.issuperset(s1))
# True
І аператар >=, і метад issuperset() вяртаюць праўду для эквівалентных набораў.
Каб вызначыць, ці з’яўляецца гэта сапраўдным супермноствам, выкарыстоўвайце аператар >=, які вяртае false для эквівалентных набораў.
print(s1 >= s1)
# True
print(s1.issuperset(s1))
# True
print(s1 > s1)
# False
Вызначэнне таго, з’яўляюцца яны ўзаемна простымі ці не:isdisjoint()
Каб вызначыць, ці з’яўляюцца два мноства простых адзін да аднаго, выкарыстоўвайце метад isdisjoint().
s1 = {0, 1}
s2 = {1, 2}
s3 = {2, 3}
print(s1.isdisjoint(s2))
# False
print(s1.isdisjoint(s3))
# True