
ํ์ด์ฌ์์์ ์งํฉ ์๋ฃํ์ ์ฐ๋ฆฌ๊ฐ ์ํ ์๊ฐ์ ๋ฐฐ์ด ๋ฒค๋ค์ด์ด๊ทธ๋จ๊ณผ ์งํฉ์ ๊ฐ๋ ์ ๊ทธ๋๋ก ์ฝ๋๋ก ์ฎ๊ฒจ๋์ ๊ฒ์ด ๋ฐ๋ก ํ์ด์ฌ์ ์งํฉ ์๋ฃํ์ ๋๋ค.
์งํฉ(Set)์ด๋?
์งํฉ์ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ ํ๋์ ๋ณ์์ ๋ชจ์์ ๊ด๋ฆฌํ ๋ ์ฌ์ฉํ๋ ํ์ด์ฌ์ ๊ธฐ๋ณธ ์๋ฃํ ์ค ํ๋์ ๋๋ค.
1๏ธโฃ ์งํฉ ์์ฑ
์งํฉ์ ์ค๊ดํธ๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ set() ํจ์๋ฅผ ์ด์ฉํ์ฌ ์์ฑํฉ๋๋ค. ๋ฐ์ดํฐ์ ์ค๋ณต์ ํ์ฉํ์ง ์๊ณ ์์๊ฐ ์์ด ์ธ๋ฑ์ฑ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค.
# ์ค๊ดํธ๋ก ์งํฉ ์์ฑ
numbers = {1,2,2,3,3,3,4,5}
print(numbers) # {1, 2, 3, 4, 5}
# set() ๋ฉ์๋๋ก ์งํฉ ์์ฑ
text_set = set("hello")
print(text_set) # {'l', 'o', 'e', 'h'}
# ๋น ์งํฉ ์์ฑ
empty_set = set()
print(type(empty_set)) # <class 'set'>
# ์๋ชป๋ ๋น ์งํฉ ์์ฑ
empty_dict = {}
print(type(empty_dict)) # <class 'dict'>
์งํฉ์ ์์ฑํด๋ณด๋ฉด, ์์๊ฐ ์๊ธฐ ๋๋ฌธ์ text_set์ ๊ฒฐ๊ณผ๊ฐ ์์ ์์ด ์ถ๋ ฅ๋๋๊ฑธ ํ์ธํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋น ์งํฉ์ ์์ฑํ ๋ ์ ์ํ ์ ์ด ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ค๊ดํธ๋ฅผ ์ฌ์ฉํ๋ฉด ์งํฉ์ ์์ฑํ ์ ์์ง๋ง, ๋น ์งํฉ ์์ฑ์ ์ค๊ดํธ๋ก ์งํํ๋ฉด ์งํฉ์ด ์๋ ๋์ ๋๋ฆฌ๋ก ์ธ์ํฉ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋น ์งํฉ์ ๋ง๋ค๊ธฐ ์ํด์๋ set() ๋ฉ์๋๋ฅผ ํ์ฉํฉ๋๋ค.
2๏ธโฃ ์งํฉ ์ฐ์ฐ์
๊ต์งํฉ(Intersection, ∩)
๊ต์งํฉ์ ๋ ๊ฐ ์ด์์ ์งํฉ์์ ๊ณตํต์ผ๋ก ์ํ๋ ๋ชจ๋ ์์๋ค์ ์งํฉ์ ์๋ฏธํฉ๋๋ค. ๋ฒค๋ค์ด์ด๊ทธ๋จ์ผ๋ก ํํํ์ ๋ ๋ ์์ด ์๋ก ๊ฒน์น๋ ์ค์ ์์ญ์ ํด๋นํฉ๋๋ค.
A ∩ B = { ๏ฝ | ๏ฝ ∈ A and ๏ฝ∈ B }
(๏ฝ๋ A์ ์์์ด๋ฉด์ ๋์์ B์ ์์์ด์ด์ผ ํ๋ค.)
ํ์ด์ฌ์์ ๊ต์งํฉ์ & ์ฐ์ฐ์ ๋๋ .intersection() ๋ฉ์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ด์ฌ ๋ด๋ถ์ ์ผ๋ก๋ ๋ ์งํฉ ์ค ์์ ์๊ฐ ๋ ์์ ์งํฉ์ ๊ธฐ์ค์ผ๋ก ์ํํ๋ฉด์, ๋ค๋ฅธ ์ชฝ ์งํฉ์ ํด๋น ์์๊ฐ ์กด์ฌํ๋์ง ํด์ ํ ์ด๋ธ ๊ฒ์ฌ๋ฅผ ์ํํฉ๋๋ค.
set1 = {10,20,30,40,50}
set2 = {30,40,50,60,70}
# & ์ฐ์ฐ์ ์ฌ์ฉ
result_op = set1 & set2
# ๋ฉ์๋ ์ฌ์ฉ
result_met = set1.intersection(set2)
print("์ฐ์ฐ์ ๊ฒฐ๊ณผ : ", result_op) # ์ฐ์ฐ์ ๊ฒฐ๊ณผ : {40, 50, 30}
print("๋ฉ์๋ ๊ฒฐ๊ณผ : ", result_met) # ๋ฉ์๋ ๊ฒฐ๊ณผ : {40, 50, 30}
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# 3๊ฐ ์ด์์ ์งํฉ์์ ๊ต์งํฉ ๊ตฌํ๊ธฐ
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
group_a = {"์ฌ๊ณผ", "๋ฐ๋๋", "ํฌ๋"}
group_b = {"๋ฐ๋๋", "ํฌ๋", "๋ธ๊ธฐ"}
group_c = {"ํฌ๋", "๋ณต์ญ์", "๋ฐ๋๋"}
# ์ฐ์ฐ์ ์ฒด์ด๋ ๋ฐ ๋ค์ค ์ธ์ ๋ฉ์๋ ์ฌ์ฉ
common_all = group_a & group_b & group_c
common_method = group_a.intersection(group_b, group_c)
print("๊ณตํต ๊ณผ์ผ :", common_all) # ๊ณตํต ๊ณผ์ผ : {'๋ฐ๋๋', 'ํฌ๋'}
ํฉ์งํฉ(Union, ∪)
ํฉ์งํฉ์ ๋ ๊ฐ ์ด์์ ์งํฉ์ ์ํ๋ ๋ชจ๋ ์์๋ค์ ํ๋๋ก ๋ชจ์ ์งํฉ์ ๋๋ค. ๋จ, ์งํฉ์ ํน์ฑ์ ์ค๋ณต๋ ์์๋ ๋จ ํ๋๋ง ๋จ๊ฒ ๋ฉ๋๋ค. ๋ฒค๋ค์ด์ด๊ทธ๋จ์ผ๋ก ํํํ์ ๋ ๋ ์์ด ์ฐจ์งํ๋ ์ ์ฒด ๋ฉด์ ์ ํด๋นํฉ๋๋ค.
A ∪ B = {๏ฝ | ๏ฝ ∈ A or๏ฝ ∈ B }
(๏ฝ๋ A์ ์์์ด๊ฑฐ๋ ๋๋ B์ ์์์ด๋ค.)
ํ์ด์ฌ์์ ํฉ์งํฉ์ | ์ฐ์ฐ์ ๋๋ .union() ๋ฉ์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ชฝ ์งํฉ์ ํด์ ํ ์ด๋ธ์ ๋ณต์ฌํ ๋ค, ๋ค๋ฅธ ์ชฝ ์งํฉ์ ์์๋ค์ ์ํํ๋ฉด์ ํด์ ์ถฉ๋(์ค๋ณต ์ฌ๋ถ)์ ์ฒดํฌํ์ฌ ์ ์์๋ฅผ ์ฝ์ ํฉ๋๋ค.
numbers_a = {1,2,3}
numbers_b = {3,4,5}
# | ์ฐ์ฐ์ ์ฌ์ฉ
union_op = numbers_a | numbers_b
# ๋ฉ์๋ ์ฌ์ฉ
union_method = numbers_a.union(numbers_b)
print("ํฉ์งํฉ ์ฐ์ฐ์:", union_op) # ํฉ์งํฉ ์ฐ์ฐ์: {1, 2, 3, 4, 5}
print("ํฉ์งํฉ ๋ฉ์๋:", union_method) # ํฉ์งํฉ ๋ฉ์๋: {1, 2, 3, 4, 5}
| ์ฐ์ฐ์๋ ์์ชฝ ๋ชจ๋ ์งํฉ์ด์ด์ผ ํ์ง๋ง, .union() ๋ฉ์๋๋ ์ธ์๋ก ๋ฆฌ์คํธ๋ ํํ์ด ๋ค์ด์๋ ์๋์ผ๋ก ์งํฉ์ผ๋ก ๋ณํํ์ฌ ํฉ์งํฉ์ ์ํํฉ๋๋ค.
base_set = {10,20}
data_list = [20,30,40]
data_tuple = (40,50,60)
# ๋ฉ์๋์ ๋ฆฌ์คํธ, ํํ์ ์ง์ ์ ๋ฌ
total_union = base_set.union(data_list, data_tuple)
print("๋ค์ํ ์๋ฃํ๊ณผ์ ํฉ์งํฉ:", total_union)
# ์ถ๋ ฅ ๊ฒฐ๊ณผ: ๋ค์ํ ์๋ฃํ๊ณผ์ ํฉ์งํฉ: {40, 10, 50, 20, 60, 30}
print(type(total_union)) # <class 'set'>
# ์๋ฌ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ
total_x = base_set | data_list | data_tuple
Traceback (most recent call last):
File "<python-input-7>", line 1, in <module>
total_x = base_set | data_list | data_tuple
~~~~~~~~~^~~~~~~~~~~
TypeError: unsupported operand type(s) for |: 'set' and 'list'
์์ชฝ ๋ชจ๋ ์งํฉ์ด ์๋ ๊ฐ์ผ๋ก | ์ฐ์ฐ์๋ฅผ ํ์ฉํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค. ์งํฉ์ด ์๋ ๊ฐ์ผ๋ก ์ฐ์ฐํ๋ ค๋ฉด .union() ๋ฉ์๋๋ฅผ ํ์ฉํด์ผ ํฉ๋๋ค.
์ฐจ์งํฉ(Difference, โ ๋๋ ๏ผผ)
์ฐจ์งํฉ์ ๊ธฐ์ค์ด ๋๋ ์งํฉ์๋ ์ํ์ง๋ง, ์ฐจ๊ฐ ๋์์ด ๋๋ ์งํฉ์๋ ์ํ์ง ์๋ ์์๋ค๋ง ๋จ๊ฒจ๋ ์งํฉ์ ๋๋ค. ์์๊ฐ ๋งค์ฐ ์ค์ํ๋ฉฐ, A โ B์ B โ A๋ ์๋ก ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋ํ๋ ๋๋ค(๊ตํ๋ฒ์น ์ฑ๋ฆฝ ์ํจ)
A โ B = {๏ฝ | ๏ฝ ∈ A and๏ฝ ∉ B }
(๏ฝ๋ A์ ์์์ด๋ฉด์ ๋์์ B์ ์์๊ฐ ์๋์ด์ผ ํ๋ค.)
ํ์ด์ฌ์ ์ฐจ์งํฉ์ โ ์ฐ์ฐ์ ๋๋ .difference() ๋ฉ์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ธฐ์ค ์งํฉ A์ ๋ชจ๋ ์์๋ฅผ ๋ณต์ฌํ ๋ค, B์ ์กด์ฌํ๋ ์์๊ฐ A์ ํฌํจ๋์ด ์๋ค๋ฉด ์ด๋ฅผ ์ ๋ณ์ ์ผ๋ก ์ ๊ฑฐํฉ๋๋ค.
set_x = {1,2,3,4,5}
set_y = {4,5,6,7,8}
diff1 = set_x - set_y
diff2 = set_y.difference(set_x)
print("set_x - set_y:", diff1) # set_x - set_y: {1, 2, 3}
print("set_y - set_x:", diff2) # set_y - set_x: {8, 6, 7}
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# ์ ์ฒด์์ ์ง์๋ฅผ ๋นผ๊ณ , 3์ ๋ฐฐ์๋ ๋บ ๊ฒฐ๊ณผ
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
total = {1,2,3,4,5,6,7,8,9,10}
events = {2,4,6,8,10}
multiples_of_three = {3,6,9}
result = total - events - multiples_of_three
print("์ง์์ 3์ ๋ฐฐ์๊ฐ ๋ชจ๋ ์ ์ธ๋ ์์:", result)
# ์ถ๋ ฅ ๊ฒฐ๊ณผ : ์ง์์ 3์ ๋ฐฐ์๊ฐ ๋ชจ๋ ์ ์ธ๋ ์์: {1, 5, 7}
3๏ธโฃ ์งํฉ ๊ด๋ จ ํจ์
์งํฉ์ ์ค๋ณต์ ํ์ฉํ์ง ์๊ณ ์์๊ฐ ์๋ ์ ์ฉํ ์๋ฃํ์ ๋๋ค. ์์ฑ๋ ์งํฉ์ ๊ฐ๋ณ(Mutable) ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์, ๋ฐ์ดํฐ๋ฅผ ๋ง๋ ์ดํ์๋ ์๋ก์ด ์์๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๊ธฐ์กด ์์๋ฅผ ์ญ์ ํ๋ฉฐ ์์ ๋กญ๊ฒ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
์์ ์ถ๊ฐ(add, update)
์งํฉ์ ์๋ก์ด ์์๋ฅผ ๋ฃ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ ๋ฉ์๋์ ๋๋ค. ๋จ์ผ ์์๋ฅผ ๋ฃ์ ๋์ ์ฌ๋ฌ ์์๋ฅผ ํ ๋ฒ์ ๋ฃ์ ๋ ์ฌ์ฉํ๋ ๋ฉ์๋๊ฐ ๊ตฌ๋ถ๋ฉ๋๋ค.
- add() ๋ฉ์๋
์งํฉ์ ๋จ ํ๋์ ์์๋ฅผ ์ถ๊ฐํฉ๋๋ค. ์ด๋ฏธ ์กด์ฌํด ์๋ ์์๋ฅผ ์ถ๊ฐํ๋ ค๊ณ ํ๋ฉด ์ค๋ณต์ ํ์ฉํ์ง ์๋ ์งํฉ์ ํน์ฑ์ ๋ณํ ์์ด ๋ฌด์๋ฉ๋๋ค.
# ๋จ์ผ ์ซ์ ์์ ์ถ๊ฐ
numbers = {1,2,3}
numbers.add(4)
print("add(4) ๊ฒฐ๊ณผ:", numbers) # add(4) ๊ฒฐ๊ณผ: {1, 2, 3, 4}
numbers.add(2)
print("add(2) ์ฌ์๋ ๊ฒฐ๊ณผ:", numbers) # add(2) ์ฌ์๋ ๊ฒฐ๊ณผ: {1, 2, 3, 4}
#๋ฌธ์์ด ์์ ์ถ๊ฐ
language = {"Python", "Java"}
language.add("C++")
print("์ธ์ด ๋ชฉ๋ก:", language) # ์ธ์ด ๋ชฉ๋ก: {'Java', 'Python', 'C++'}
# ์ค๋ฌธ์กฐ์ฌ ์๋ต์ ์ค๋ณต ๋ฐฉ์ง ๋ฑ๋ก
respondents = {"user_a", "user_b"}
# ์ ๊ท ์๋ต์ ์ ์ถ
new_respondent = "user_c"
if new_respondent not in respondents:
respondents.add(new_respondent)
print(f"{new_respondent}๋์ ์๋ต์ด ์ฑ๊ณต์ ์ผ๋ก ๋ฑ๋ก๋์์ต๋๋ค.")
else:
print("์ด๋ฏธ ์๋ตํ ์ฌ์ฉ์์
๋๋ค.")
# ์ถ๋ ฅ ๊ฒฐ๊ณผ : user_c๋์ ์๋ต์ด ์ฑ๊ณต์ ์ผ๋ก ๋ฑ๋ก๋์์ต๋๋ค.
- update() ๋ฉ์๋
๋ฆฌ์คํธ, ํํ, ๋ค๋ฅธ ์งํฉ ๋ฑ ๋ฐ๋ณต ๊ฐ๋ฅํ ๊ฐ์ฒด์ ์ฌ๋ฌ ์์๋ฅผ ํ ๋ฒ์ ๊ธฐ์กด ์งํฉ์ ๋ณํฉํ์ฌ ์ถ๊ฐํฉ๋๋ค.
my_set = {1,2}
# ๋ฆฌ์คํธ ํํ๋ก ์ ๋ฌํ์ฌ ์ฌ๋ฌ ๊ฐ ์ผ๊ด ์ถ๊ฐ
my_set.update([3,4,5])
print("update ๊ฒฐ๊ณผ:", my_set) # update ๊ฒฐ๊ณผ: {1, 2, 3, 4, 5}
letters = {"a", "b"}
# ํํ ์ ๋ฌ
letters.update(("c","d"))
print("update ํ:", letters) # update ํ: {'c', 'b', 'd', 'a'}
print(type(letters)) # <class 'set'>
์์ ์ญ์ (remove, discard, pop, clear)
์งํฉ์์ ํน์ ์์๋ฅผ ์ ๊ฑฐํ๊ฑฐ๋ ์ ์ฒด๋ฅผ ๋น์ธ ๋ ์ํฉ์ ๋ง์ถฐ ์ ์ ํ ์ญ์ ๋ฉ์๋ค๋ฅด ๊ณจ๋ผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- remove() ๋ฉ์๋
์งํฉ์์ ํน์ ์์๋ฅผ ์ง์ ํ์ฌ ์ญ์ ํฉ๋๋ค. ๋ง์ฝ ์ญ์ ํ๋ ค๋ ์์๊ฐ ์งํฉ์ ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ keyError ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค.
colors = {"red", "green", "blue"}
colors.remove("green")
print("์ญ์ ํ ์งํฉ:", colors) # ์ญ์ ํ ์งํฉ: {'blue', 'red'}
try:
colors.remove("yello")
except KeyError as e:
print(f"KeyError ๋ฐ์: {e} ์์๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.")
# ์ถ๋ ฅ ๊ฒฐ๊ณผ : KeyError ๋ฐ์: 'yello' ์์๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.
- discard() ๋ฉ์๋ (์๋ฌ ๋ฌด์)
์งํฉ์์ ํน์ ์์๋ฅผ ์ง์ ํ์ฌ ์ญ์ ํฉ๋๋ค. remove() ๋ฉ์๋์ ๋ฌ๋ฆฌ ์ญ์ ํ๋ ค๋ ์์๊ฐ ์งํฉ์ ์กด์ฌํ์ง ์๋๋ผ๋ ์๋ฌ๋ฅผ ๋ฐ์์ํค์ง ์๊ณ ์์ ํ๊ฒ ํต๊ณผํฉ๋๋ค.
fruits = {"apple", "banana"}
# ์กด์ฌํ๋ ์์ ์ญ์
fruits.discard("apple")
# ์กด์ฌํ์ง ์๋ ์์ ์ญ์ ์๋ (์ค๋ฅ ์์ด ์ ์ ์งํ)
fruits.discard("orange")
print("discard ์คํ ํ:", fruits) # discard ์คํ ํ: {'banana'}
- pop() ๋ฉ์๋
์งํฉ์ ์์๊ฐ ์์ผ๋ฏ๋ก ํน์ ์์น๊ฐ ์๋ ์์์(๋ฌด์์) ์์ ํ๋๋ฅผ ๊บผ๋ด์ด ๋ฐํํ๊ณ ์งํฉ์์ ์ ๊ฑฐํฉ๋๋ค. ๋น ์งํฉ์ pop()์ ์คํํ๋ฉด KeyError๊ฐ ๋ฐ์ํฉ๋๋ค.
numbers = {10,20,30}
# ์์์ ์์ ๋ฐํ ๋ฐ ์ญ์
removed_val = numbers.pop()
print("๊บผ๋ธ ์์:", removed_val) # ๊บผ๋ธ ์์: 10
print("๋จ์ ์งํฉ:", numbers) # ๋จ์ ์งํฉ: {20, 30}
# ๋น ์งํฉ ์์ธ ์ฒ๋ฆฌ
# ๋น ์งํฉ์์๋ pop์ ์คํํ ์ ์์ต๋๋ค.
empty_set = set()
try:
empty_set.pop()
except KeyError:
print("๋น ์งํฉ์์๋ pop()์ ์ํํ ์ ์์ต๋๋ค.")
# ์ถ๋ ฅ ๊ฒฐ๊ณผ : ๋น ์งํฉ์์๋ pop()์ ์ํํ ์ ์์ต๋๋ค.
# ์์
ํ(Task Queue) ๋น๋๊ธฐ ์์ง
tasks = {"task_a","task_b","task_c"}
# ๋ชจ๋ ์์
์ด ์๋ฃ๋ ๋๊น์ง ์์๋ก ๊บผ๋ด์ด ์ฒ๋ฆฌ
while tasks:
current_task = tasks.pop()
print(f"[{current_task}] ์์
์ฒ๋ฆฌ ์ค...")
# ์ถ๋ ฅ ๊ฒฐ๊ณผ : [task_c] ์์
์ฒ๋ฆฌ ์ค...
# ์ถ๋ ฅ ๊ฒฐ๊ณผ : [task_b] ์์
์ฒ๋ฆฌ ์ค...
# ์ถ๋ ฅ ๊ฒฐ๊ณผ : [task_a] ์์
์ฒ๋ฆฌ ์ค...
print("๋ชจ๋ ์์
์๋ฃ!!")
- clear() ๋ฉ์๋
์งํฉ ๋ด๋ถ์ ๋ชจ๋ ์์๋ฅผ ์ผ๊ด ์ญ์ ํ์ฌ ๋น ์งํฉ(set()) ์ํ๋ก ๋ง๋ญ๋๋ค.
data = {1,2,3,4,5}
# ์ ์ฒด ์์ ์ด๊ธฐํ
data.clear()
print("clear() ํธ์ถ ํ:", data) # clear() ํธ์ถ ํ: set()
print("์งํฉ ํฌ๊ธฐ:", len(data)) # ์งํฉ ํฌ๊ธฐ: 0
@Junesker