[파이썬 입문] 3. 제어문과 컬렉션 – 8) dictionary와 set

dictionary

dictionary는 키와 값을 보관하는 컬렉션입니다.

영어사전에 단어와 뜻이 있는 것처럼 dictonary에는 키와 값이 있습니다.

dictionary는 중괄호에 아이템을 열거하는데 키와 값은 콜론으로 구분합니다.

변수 = {키:값, 키:값, 키:값, …}

다음은 정수를 키, 문자열을 값으로 하는 사전을 표현한 것입니다.

[In]
num_dic = {1:"One",2:"Two",3:"Three" }
print(num_dic)
[Out]
{1: 'One', 2: 'Two', 3: 'Three'}

dictionary에 인덱스 연산에 키를 넣으면 값을 참조할 수 있습니다.

[In]
print(num_dic[1])
[Out]
One

dictionary에 보관할 때도 인덱스에 키를 넣고 값을 대입 연산을 이용하여 넣습니다.

[In]
num_dic[4] = "Four"
print(num_dic)
[Out]
{1: 'One', 2: 'Two', 3: 'Three', 4: 'Four'}

dictionary에 아이템을 삭제할 때는 del을 이용합니다.

[In]
del num_dic[2]
print(num_dic)
[Out]
{1: 'One', 3: 'Three', 4: 'Four'}

키를 이용하여 멤버쉽 연산(in)을 사용할 수 있습니다.

[In]
number = int(input("번호:"))
if number in num_dic:
  print(num_dic[number])
else:
  print(number," 없습니다.")
[Out 1]
번호:5
5  없습니다.
[Out 1]
번호:2
Two

for 문의 in 뒤에 dictionary 변수가 오면 키를 반복 참조할 수 있습니다.

[In]
for elem in num_dic:
  print(elem,end=' ')
[Out]
1 3 4 

키와 값을 모두 확인하려면 dictionary의 items 메서드를 이용하세요.

[In]
for item  in num_dic.items():
  print(item)
[Out]
(1, 'One')
(3, 'Three')
(4, 'Four')

다음처럼 사용할 수도 있습니다.

[In]
for key,value in num_dic.items():
  print(key,":",value)
[Out]
1 : One
3 : Three
4 : Four

dictionary의 키와 값은 어떠한 형식도 올 수 있습니다.

다음은 키로 문자열 값으로 리스트인 dictionary입니다.

[In]
group_dic = {}
group_dic["kor"] = ["하나","둘","셋"]
group_dic["eng"] = ["One","Two","Three"]
print(group_dic)
[Out]
{'kor': ['하나', '둘', '셋'], 'eng': ['One', 'Two', 'Three']}

set

set은 단어 그대로 집합입니다.

set도 중괄호로 표현합니다. 그리고 set은 같은 원소를 보관하지 않습니다.

[In]
s = {1,3,4,5,3,2,4,5}
print(s)
[Out]
{1, 2, 3, 4, 5}

set도 멤버쉽 연산 in을 사용할 수 있습니다.

[In]
number = int(input("번호:"))
if number in s:
  print("있습니다.")
else:
  print("없습니다.")
[Out 1]
번호:6
없습니다.
[Out 1]
번호:2
있습니다.

set에 원소를 추가할 때 add 메서드를 사용합니다.

[In]
s.add(6)
print(s)
[Out]
{1, 2, 3, 4, 5, 6}

이미 있는 원소를 보관하라고 해도 변화가 없습니다.

[In]
s.add(4)
print(s)
[Out]
{1, 2, 3, 4, 5, 6}

원소를 제거할 때 remove 메서드를 사용할 수 있어요.

[In]
s.remove(4)
print(s)
[Out]
{1, 2, 3, 5, 6}

없는 원소를 remove 메서드로 삭제를 요청하면 KeyError가 발생합니다.

[In]
s.remove(4)
print(s)
[Out]
KeyError                                  Traceback (most recent call last)
<ipython-input-19-116ead2c6ac6> in <module>()
----> 1 s.remove(4)
      2 print(s)

KeyError: 4

discard 메서드를 이용하여 원소를 삭제할 수도 있습니다. remove 메서드와 다르게 없는 원소를 discard 메서드로 삭제 요청을 하면 아무런 일도 발생하지 않습니다.

[In]
s.discard(4)
print(s)
[Out]
{1, 2, 3, 5, 6}

다음은 discard 메서드로 원소 2를 삭제하는 코드입니다.

[In]
s.discard(2)
print(s)
[Out]
{1, 2, 3, 5, 6}

집합은 여러 가지 연산을 제공합니다. 여기에서는 합집합(A∪B), 교집합(A∩B) 차집합(A-B), 대차집합(A∪B – A∩B)을 알아볼게요.

다음은 2의 배수와 3의 배수로 구성한 집합 s1, s2입니다.

[In]
s1 = {x for x in range(2,30,2)}
s2 = {x for x in range(3,30,3)}
print(s1)
print(s2)
[Out]
{2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28}
{3, 6, 9, 12, 15, 18, 21, 24, 27}

합집합은 | 기호나 union 메서드를 사용합니다.

[In]
s3 = s1|s2
print(s3)
s3 = s1.union(s2)
print(s3)
[Out]
{2, 3, 4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 22, 24, 26, 27, 28}
{2, 3, 4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 22, 24, 26, 27, 28}

교집합은 & 기호나 intersection 메서드를 사용합니다.

[In]
s4 = s1 & s2
print(s4)
s4=s1.intersection(s2)
print(s4)
[Out]
{24, 18, 12, 6}
{24, 18, 12, 6}

차집합은  기호나 difference 메서드를 사용합니다.

[In]
s5 = s1 - s2
print(s5)
s5 = s1.difference(s2)
print(s5)
[Out]
{2, 4, 8, 10, 14, 16, 20, 22, 26, 28}
{2, 4, 8, 10, 14, 16, 20, 22, 26, 28}

대차집합은 ^ 기호나 symmetric_difference 메서드를 사용합니다.

[In]
s6 = s1 ^ s2
print(s6)
s6 = s1.symmetric_difference(s2)
print(s6)
[Out]
{2, 3, 4, 8, 9, 10, 14, 15, 16, 20, 21, 22, 26, 27, 28}
{2, 3, 4, 8, 9, 10, 14, 15, 16, 20, 21, 22, 26, 27, 28}