Част 2: Представяне на някои от най-популярните и използвани методи, които могат да бъдат приложени за набор от обекти в Python.

Продължавайки моята последна статия, където представих основите на работа с множества в Python, ще покажа някои от най-популярните и използвани методи, които могат да бъдат приложени за множество обекти, за да получите какво имаме нужда от тях.

Добавяне на елемент към набор

Това наистина е много просто и ясно нещо:

# create initial set
my_set = {1, 2, 3, 4}
print(f"{id(my_set)}: {my_set}")
# add an element to the set
my_set.add(5)
print(f"{id(my_set)}: {my_set}")
Output:
140148778101664: {1, 2, 3, 4}
140148778101664: {1, 2, 3, 4, 5}

Резултатът е предвидим: нашата променлива сочи към същия обект, въпреки че съдържанието на набора е променено; това е така, защото множествата са променливи.

Изпразване (изчистване) на набор

Както беше предложено, това е начинът, по който ефективно изчистваме набора от всички елементи:

# create initial set
my_set = {1, 2, 3, 4}
print(f"{id(my_set)}: {my_set}")
# empty the set
my_set.clear()
print(f"{id(my_set)}: {my_set}")
Output:
140136966093728: {1, 2, 3, 4}
140136966093728: set()

Копиране на набор

За този вече са се погрижили. Преминете към тази статия, за да видите как работи това.

Задайте разлика

Методът set.difference(another_set) ще изведе набор, който ще съдържа елементи, намерени в първия набор, но не и във втория. Както подсказва името му, това е разлика в комплектите:

# define our sets
my_first_set = {1, 2, 3, 4}
my_second_set = {3, 4}
# print out the original sets
print(f"{id(my_first_set)}: {my_first_set}")
print(f"{id(my_second_set)}: {my_second_set}")
# first set minus the second
a_minus_b = my_first_set.difference(my_second_set)
# vice-versa: second set minus the first
b_minus_a = my_second_set.difference(my_first_set)
# print out the original sets once more
print(f"{id(my_first_set)}: {my_first_set}")
print(f"{id(my_second_set)}: {my_second_set}")
# print the resulting 'difference' sets
print(f"{id(a_minus_b)}: {a_minus_b}")
print(f"{id(b_minus_a)}: {b_minus_a}")
Output:
140449652075424: {1, 2, 3, 4}
140449650999072: {3, 4}
140449652075424: {1, 2, 3, 4}
140449650999072: {3, 4}
140449651032128: {1, 2}
140449651032352: set()

Оригиналните набори са непроменени след прилагането на метода difference към тях. Едно нещо, което трябва да се отбележи обаче е, че редът се брои тук, тъй като a.difference(b) няма да бъде същото като b.difference(a), освен ако a не съдържа същите елементи като b. В този конкретен случай разликата, независимо от реда на двата набора ( a.difference(b) или b.difference(a)), очевидно ще бъде празен набор.

Задайте актуализация на разликата

Донякъде подобен на разликата в набора, този гарантира, че елементите, намерени в двата набора, се елиминират от първия набор. Числен пример ще докаже много повече прозрение, отколкото думите могат да постигнат:

# define our sets
my_first_set = {1, 2, 3, 4}
my_second_set = {3, 4, 5}
print(f"{id(my_first_set)}: {my_first_set}")
print(f"{id(my_second_set)}: {my_second_set}")
# common elements will be eliminated from the first set
my_first_set.difference_update(my_second_set)
print(f"{id(my_first_set)}: {my_first_set}")
print(f"{id(my_second_set)}: {my_second_set}")
Output:
140531133254560: {1, 2, 3, 4}
140531132176192: {3, 4, 5}
140531133254560: {1, 2}
140531132176192: {3, 4, 5}

Това, което се случи, беше, както ни показва изходът, че елементите 3 и 4 на първия набор бяха елиминирани, тъй като те присъстваха и във втория набор. Нека опитаме по обратния начин и да видим какво ще се случи:

# define our sets
my_first_set = {1, 2, 3, 4}
my_second_set = {3, 4, 5}
print(f"{id(my_first_set)}: {my_first_set}")
print(f"{id(my_second_set)}: {my_second_set}")
# common elements will be eliminated from the second set
my_second_set.difference_update(my_first_set)
print(f"{id(my_first_set)}: {my_first_set}")
print(f"{id(my_second_set)}: {my_second_set}")
139629253205792: {1, 2, 3, 4}
139629254282144: {3, 4, 5}
139629253205792: {1, 2, 3, 4}
139629254282144: {5}

Този път вторият комплект беше лишен от елементите, открити и в първия комплект.

Отхвърляне на елемент

Ето как да премахнете конкретен елемент от набор. Методът set.discard() се използва ефективно за постигане на тази цел. Едно важно нещо, което трябва да вземете под внимание: не предизвиква изключение, ако елементът, който трябва да бъде изхвърлен, не присъства в набора. Нито връща стойността на отхвърления елемент, ако операцията е успешна.

# define the set
my_set = {1, 2, 3, 4}
print(f"{id(my_set)}: {my_set}")
# discard an existing element
my_set.discard(3)
print(f"{id(my_set)}: {my_set}")
# now, discard a non-existing element
my_set.discard(33)
print(f"{id(my_set)}: {my_set}")
Output:
140415925709728: {1, 2, 3, 4}
140415925709728: {1, 2, 4}
140415925709728: {1, 2, 4}

Резултатът разказва цялата история, наистина.

Задава пресичане

Ако в определени моменти трябва да уловим общи елементи от два набора в друг трети набор, set.intersection() е методът, към който трябва да отидем.

# define the sets
my_first_set = {1, 2, 3, 4}
my_second_set = {3, 4, 5}
# intersect the two
my_third_set = my_first_set.intersection(my_second_set)
print(f"{id(my_first_set)}: {my_first_set}")
print(f"{id(my_second_set)}: {my_second_set}")
print(f"{id(my_third_set)}: {my_third_set}")
Output:
140320506070400: {1, 2, 3, 4}
140320506070176: {3, 4, 5}
140320506071520: {3, 4}

Актуализация на кръстовището

За разлика от difference_update(), използван, когато имаме нужда, например, set_1 да бъде лишен от елементи, намерени в set_2, този intersection_update() метод, приложен към set_1, гарантира, че set_1 няма да съдържа нищо друго освен елементите, които има общи с set_2:

# define our sets
my_first_set = {1, 2, 3, 4}
my_second_set = {3, 4, 5}
print(f"{id(my_first_set)}: {my_first_set}")print(f"{id(my_second_set)}: {my_second_set}")
# strip the first set of elements not in the second set
my_first_set.intersection_update(my_second_set)
print(f"{id(my_first_set)}: {my_first_set}")
print(f"{id(my_second_set)}: {my_second_set}")
Output:
139856151455104: {1, 2, 3, 4}
139856151454880: {3, 4, 5}
139856151455104: {3, 4}
139856151454880: {3, 4, 5}

Както се очакваше, нашият първи набор сега съдържа само елементи, които бяха намерени както в него, така и във втория набор. Нещо като кръстовище на място.

Тест за нулево пресичане

Докато сме на темата за пресичането, има метод, наречен isdisjoint(), който определя дали две групи нямат общ елемент:

# define our sets
my_first_set = {1, 2, 3, 4}
my_second_set = {3, 4, 5}
# these sets do share a couple of elements
print(my_first_set.isdisjoint(my_second_set))
# redefine the second set
my_second_set = {5, 6, 7}
# now the pair of sets shares no element
print(my_first_set.isdisjoint(my_second_set))
Output:
False
True

Тествайте дали наборът е подмножество на друг

Това е полезно, когато трябва да определим дали един набор се съдържа изцяло в друг набор:

# define our sets
my_first_set = {1, 2, 3, 4}
my_second_set = {3, 4, 5}
# second set is not a subset of the first (it also contains 5)
print(my_second_set.issubset(my_first_set))
# redefine the second set
my_second_set = {3, 4}
# this one is indeed a subset of the first
print(my_second_set.issubset(my_first_set))
Output:
False
True

Тествайте дали наборът е надмножество на друг

Същият принцип, противоположен ъгъл. Това определя дали един набор съдържа напълно друг набор:

# define our sets
my_first_set = {1, 2, 3, 4}
my_second_set = {3, 4, 5}
# first set isn't a superset (second set contains 5)
print(my_first_set.issuperset(my_second_set))
# redefine the second set
my_second_set = {3, 4}
# first set is now a superset of the second set
print(my_first_set.issuperset(my_second_set))
Output:
False
True

Пускане на елемент от комплекта

Методът set.pop() премахва (и също връща) елемент от набора. Внимавайте обаче, тъй като наборите не са подредени и виждайки, че set.pop() не приема аргументи, следователно изважда привидно случаен елемент от набора:

# define our set
my_set = {1, 2, 3, 4}
print(f"{id(my_set)}: {my_set}")
# pop an element from the set and then print it out
popped_element = my_set.pop()
print(popped_element)
print(f"{id(my_set)}: {my_set}")
Output:
140309932172672: {1, 2, 3, 4}
1
140309932172672: {2, 3, 4}

Премахнете елемент от набора

Подобно на set.discard(), този също премахва елемент от набора. Въпреки това, за разлика от set.discard(), set.remove() също предизвиква изключение, ако посоченият елемент не се съдържа в набора:

# define our set
my_set = {1, 2, 3, 4}
print(f"{id(my_set)}: {my_set}")
# remove 1 from the set
my_set.remove(1)
print(f"{id(my_set)}: {my_set}")
# remove 5 from the set
my_set.remove(5)
Output:
140485046752640: {1, 2, 3, 4}
140485046752640: {2, 3, 4}
Traceback (most recent call last):
  ...
    my_set.remove(5)
KeyError: 5

Симетрична разлика

Това връща набор, съдържащ елементите, които съществуват само в един от двата набора:

# define our sets
my_first_set = {1, 2, 3, 4}
my_second_set = {3, 4, 5}
# calculate symmetric difference of first and second set
my_third_set = my_first_set.symmetric_difference(my_second_set)
# calculate symmetric difference of second and first set
my_fourth_set = my_second_set.symmetric_difference(my_first_set)
# print out the results
print(f"{id(my_first_set)}: {my_first_set}")
print(f"{id(my_second_set)}: {my_second_set}")
print(f"{id(my_third_set)}: {my_third_set}")
print(f"{id(my_fourth_set)}: {my_fourth_set}")
Output:
140226603695008: {1, 2, 3, 4}
140226602616640: {3, 4, 5}
140226602618656: {1, 2, 5}
140226602651712: {1, 2, 5}

Симетричната разлика може да се разглежда като противоположност на пресечната точка, връщаща само това, което е уникално за всеки от двата въпросни комплекта. Както можете да видите, няма разлика между това да го извикате на първия набор, докато имате втория набор като аргумент, и да го извикате на втория набор, докато имате първия набор като аргумент.

Актуализация на симетрична разлика

Това е много подобно на представения по-рано symmetric_difference(), с единственото изключение, че този е in-place symmetric_difference(), което означава, че не връща нищо, но изпълнява операцията върху един от двата въпросни комплекта:

# define our sets
my_first_set = {1, 2, 3, 4}
my_second_set = {3, 4, 5}
print(f"{id(my_first_set)}: {my_first_set}")
print(f"{id(my_second_set)}: {my_second_set}")
# perform symmetric difference and store it in the first set
my_first_set.symmetric_difference_update(my_second_set)
print(f"{id(my_first_set)}: {my_first_set}")
print(f"{id(my_second_set)}: {my_second_set}")
Output:
140468212136864: {1, 2, 3, 4}
140468211058496: {3, 4, 5}
140468212136864: {1, 2, 5}
140468211058496: {3, 4, 5}

Задайте съюз

Това прави точно това, което подсказва името му: извършва обединението на два набора (или на набор и друг итерируем, било то списък или кортеж, например):

# define our sets
my_first_set = {1, 2, 3, 4}
my_second_set = {5, 6, 7}
# perform the union
my_third_set = my_first_set.union(my_second_set)
print(f"{id(my_first_set)}: {my_first_set}")
print(f"{id(my_second_set)}: {my_second_set}")
print(f"{id(my_third_set)}: {my_third_set}")
Output:
140592551660448: {1, 2, 3, 4}
140592550582080: {5, 6, 7}
140592550584096: {1, 2, 3, 4, 5, 6, 7}

Задайте актуализация

Като union(), но този не връща нищо. Това е съюз на място:

# define our sets
my_first_set = {1, 2, 3, 4}
my_second_set = {5, 6, 7}
# perform the union of the first set and the second set
my_first_set.update(my_second_set)
print(f"{id(my_first_set)}: {my_first_set}")
print(f"{id(my_second_set)}: {my_second_set}")
Output:
140048657238944: {1, 2, 3, 4, 5, 6, 7}
140048656160576: {5, 6, 7}

Това беше доста дълго пътуване в територията на наборите на Python. Но ние се върнахме малко по-осведомени в този аспект. Което е и целта на тази статия. Ще се видим на следващия. Дотогава бъдете в безопасност и щастливо кодиране!

Повече съдържание в PlainEnglish.io. Регистрирайте се за нашия безплатен седмичен бюлетин. Следвайте ни в Twitter и LinkedIn. Присъединете се към нашата общност Discord.