본문 바로가기

💻 Python/🔎기초 Python

8. Dictionary와 Set 데이터 타입

8. Dictionary와 Set 데이터 타입

  • Dictionary와 Set데이터 타입은 순서가 없다.

(1) 딕셔너리(Dictionary)

  • 시퀀스 데이터 타입(리스트(List),튜플(Tuple),레인지(range))와 다르게 key값으로 인덱싱을 한다
#딕셔너리 생성하기

#(1)직접 {key1:value1, key2:value2 …}와같은 형태로 생성
a = {"a":3,"b":2,"c":1}
print(a)
print(type(a))

#(2)딕셔너리의 Constructor를 이용하여 생성
a = dict(a=3,b=2,c=1)
print(a)
print(type(a))
{'a': 3, 'b': 2, 'c': 1}
<class 'dict'>
{'a': 3, 'b': 2, 'c': 1}
<class 'dict'>
#Key:value 형태로 데이터를 묶는 데이터 타입

#(1)시퀀스 데이터 타입과는 다르게 Key값으로 인덱싱을 한다
print(a["a"])
print(a["b"])
print(a["c"])
print("-"*30)

#(2)e딕셔너리 내장함수 get()을 사용해서도 가져올 수 있다.
print(a.get("a"))
print(a.get("d"))
print("-"*30)
#get()의 두번째 파라미터에 값을 주어 기본값을 지정해 줄 수도 있다(없는 경우 None대신 출력될 값)
print(a.get("a","없음"))
print(a.get("d","없음"))
print("-"*30)

#딕셔너리 안의 특정 키의 유무는 in을 사용하여 확인 가능
print("a" in a)
print("d" in a)
3
2
1
------------------------------
3
None
------------------------------
3
없음
------------------------------
True
False
#딕셔너리 안에 어떤 키들이 포함되어있는지 확인하는 법 : 딕셔너리의 내장함수 keys()를 사용
print(a.keys())

#파이썬 2.X 때에는 keys() 가 리스트 형식으로 값을 돌려줬으나 
#메모리를 효율적으로 사용하기 위해 파이썬 3.0부터는 dict_keys라는 객체 형태로 리턴하게 하였다.
print(type((a.keys())))

#for문을 사용하거나 List로 형변환(Casting)하여 사용하면 된다. 
#(1) For문을 사용하여 str로 형변환
print("-"*30)
for key in a.keys():
    print(key)
    print(type(key))

#(2) List로 형변환(Casting)
print("-"*30)
keys = list(a.keys())
print(keys)
print(type(keys))
dict_keys(['a', 'b', 'c'])
<class 'dict_keys'>
------------------------------
a
<class 'str'>
b
<class 'str'>
c
<class 'str'>
------------------------------
['a', 'b', 'c']
<class 'list'>
#중복 처리 
#똑같은 key값을 넣으면, 한 개는 제외한 나머지는 무시된다

a = {"a":3,"b":2,"a":1}
print(a)
{'a': 1, 'b': 2}

(2) 셋(Set)

  • 딕셔너리와 비슷하게 생겼으나 key가 없는 형태
  • 순서가 없기 때문에 인덱싱이 되지 않음
  • 중복을 허용하지 않음 --> 쉽게 중복처리 가능
  • 집합의 형태를 쉽게 처리하기 위한 데이터 타입
    • 교집합, 합집합, 차집합을 손쉽게 구할 수 있음
#셋 생성하기

#(1)직접 {value1, value2 …}와같은 형태로 생성
a = {3, 2, 1}
print(a)
print(type(a))
print("-"*30)

#(2)셋의 Constructor를 이용하여 생성
a = set((3,2,1))
print(a)
print(type(a))
{1, 2, 3}
<class 'set'>
------------------------------
{1, 2, 3}
<class 'set'>
#순서가 없기 때문에 인덱싱되지 않는다.
#실행 하면 에러 발생
#a = {1,2,3}
#print(a[0])
#중복을 허용하지 않는다. 
a = {1,2,1,3}
print(a)
print("-"*30)

#중복제거하는데 사용할 수 있다.
#List의 중복을 제거하려면, remove()라는 List내장함수 사용해야한다. ---> 오래 걸린다.
b = [1,2,2,2,2,2]
print(b)
b.remove(2)
print(b)
print("-"*30)

#셋으로 형변환해서 중복 제거 후, 리스트로 다시 형변환해준다 ---> 간단하게 해결가능하다.
b = [1,2,2,2,2,2]
print(b)
print("-"*30)

b = set(b)
print(b)
print("-"*30)

b = list(b)
print(b)
{1, 2, 3}
------------------------------
[1, 2, 2, 2, 2, 2]
[1, 2, 2, 2, 2]
------------------------------
[1, 2, 2, 2, 2, 2]
------------------------------
{1, 2}
------------------------------
[1, 2]
#집합의 형태를 쉽게 처리하기 위한 데이터 타입
#교집합, 합집합, 차집합을 손쉽게 구할 수 있음

a = {1,2,3}
b = {2,3,5}

#교집합 &
print(a&b)
print("-"*30)

#합집합 |
print(a|b)
print("-"*30)

#차집합 -
print(a-b)
print(b-a)
print("-"*30)
{2, 3}
------------------------------
{1, 2, 3, 5}
------------------------------
{1}
{5}
------------------------------