🐍파이썬/📕점프 투 파이썬

3. 자료형 - 튜플, 딕셔너리, 집합

와이드윤 2020. 12. 8. 13:56
728x90

"""

파이썬 공부 3일차

20200720

"""

 

오늘은 오전에 헬스 갔다가 오후에 공부 시작함 자료형은 이제 내일만 하면 끝 ..

아 근데 이게 VS code 내에서 주석 때문에 # 쓰는데 이거때문에 블로그 해시태그 와장창임 썅 다 지워야 되나

 

튜플 자료형

몇 가지를 제외하고는 리스트와 거의 비슷함

다른 점 1. 리스트는 []으로 둘러싸지만 튜플은 ()로 둘러싼다.

다른 점 2. 리스트는 그 값의 생성, 삭제, 수정이 가능하지만 튜플은 그 값을 바꿀 수 없다.

 

튜플 예시

t1 = ()
t2 = (1, )
t3 = (1, 2, 3)
t4 = 1, 2, 3
t5 = ('a', 'b', ('ab', 'cd'))

단지 1개의 요소(t2)를 가질 때는 요소 뒤에 ,를 반드시 붙여야 함

t4처럼 () 생략 가능하다.

 

튜플과 리스트의 가장 큰 차이점은 요솟값을 변화시킬 수 있는가 없는가의 여부다.

리스트는 항목 값이 변화가 가능하다.

따라서 수시로 그 값을 변화시켜야 할 경우라면 리스트를 사용하는 게 적절하다.

 

but, 튜플은 항목 값이 변화가 안된다.

프로그램이 실행되는 동안 그 값이 항상 같아야 할 때 사용하는 것이 적절하다.

 

그렇다면 튜플의 값을 변형시키거나 삭제하려고 하면 어떤 일이 발생할까?

 

튜플 요솟값 삭제

t1 = (1, 2, 'a', 'b')

del t1[0]

>>> "TypeError: 'tuple' object doesn't support item deletion"

 

튜플 요솟값 변경

t1 = (1, 2, 'a', 'b')

t1[0] = 'c'

>>> "TypeError: 'tuple' object doesn't support item deletion"

 

튜플 역시 인덱싱, 슬라이싱, 더하기, 곱하기, 길이를 구할 수 있다.

리스트와 같은 방식으로 가능하다.

 

예제. (1,2,3)이라는 튜플에 값 4를 추가하여 (1,2,3,4)를 만들어 출력해보자.

t1 = (1,2,3)
t2 = (4,)

a = t1 + t2

print(a)

 

딕셔너리 자료형

딕셔너리: Key와 Value를 한 쌍으로 갖는 자료형

딕셔너리는 리스트나 튜플처럼 순차적으로 해당 요솟값을 구하지 않고, Key를 통해 Value를 얻는다.

{Key1:Value1, Key2:Value2, Key3:Value3 ...}

dic = {'name':'wideyoon', 'age':'25', 'birth':'0917'}

key: name, age, birth

value: wideyoon, 25, 0917

 

Value에 리스트도 넣을 수 있다.

a = {'a' : [1, 2, 3]}

 

딕셔너리 쌍 추가, 삭제

1. 추가하기

a = {1 : 'a'}
a[2] = 'b' # {2 : 'b'} 쌍 추가

print(a)
>>> {1:'a', 2:'b'}


a['name'] = 'wideyoon' # {'name' : 'wideyoon} 쌍 추가

print(a)


a[3] = [1, 2, 3] # {3 : [1, 2, 3]} 쌍 추가

print(a)

 

어떻게 추가 될지 Do it yourself

 

2. 삭제하기

del a[1] # key가 1인 key:value 쌍 삭제

print(a)

 

딕셔너리에서 key 사용해 value 얻기

grade = {'wide':10, 'yoon':99}

print(grade['wide']) # key가 'wide'인 value를 출력
print(grade['yoon']) # key가 'yoon'인 value를 출력

리스트나 튜플, 문자열은 요솟값을 얻으려 할 때 인덱싱이나 슬라이싱 중 하나를 사용한다.

하지만 딕셔너리는 key를 사용하여 value를 구한다.

어떤 key의 value를 얻으려면 '딕셔너리 변수 이름[Key]'를 사용하면 된다.

a = {1:'a', 2:'b'}

print(a[1])
print(a[2])

a[1]이 의미하는 것은 리스트나 튜플의 a[1]과는 다른 의미다.

딕셔너리 변수에서 []안의 숫자1은 두 번째 요소를 뜻하는 게 아닌 key에 해당하는 1을 나타낸다.

딕셔너리는 리스트나 튜플에 있는 인덱싱 방법을 적용할 수 없다. (오류 발생)

 

딕셔너리를 만들 때, key는 고유한 값이므로 중복되는 key 값을 설정하면 하나를 제외한 나머지 것들이 모두 무시 된다.

왜? Key를 통해서 value를 얻는 딕셔너리의 특징때문 -> 어떤 Key에 해당하는 value를 불러야 할 지 알 수 없다.

 

Key에 리스트를 쓸 수 없지만 튜플은 Key로 쓸 수 있다.

Key로 쓸 수 있느냐 없느냐는 Key가 변하는 값인지 변하지 않는 값인지에 따라 결정된다.

 

딕셔너리 관련 함수

Key 리스트 만들기; keys

a = {'name':'윤정현', 'phone':'01012341234', 'birth':'0917'}
b = a.keys()

print(b)
>>> dict_keys(['name', 'phone', 'birth'])
    
    
    
for k in a.keys():

print(k)
>>> name / phone / birth

 

이건 파이썬 3.0부터 되는 건데 직접 해보는 것이 좋을듯

dict_keys 객체를 리스트로 변환

a = list(a.keys())

print(a)
>>> ['name', 'phone', 'birth']

 

Value 리스트 만들기; values

a = {'name':'윤정현', 'phone':'01012341234', 'birth':'0917'}
b = a.values()

print(b)
>>> dict_values(['윤정현', '01012341234', '0917'])

 

Key, Value 쌍 얻기; items

a = {'name':'윤정현', 'phone':'01012341234', 'birth':'0917'}
b = a.items()

print(b)
>>> dict_items([('name', '윤정현'), ('phone', '01012341234'), ('birth', '0917')])

 

Key : Value 쌍 모두 지우기; clear

a = {'name':'윤정현', 'phone':'01012341234', 'birth':'0917'}
a.clear()

print(a) 
>>> {}

 

Key로 Value 얻기; get

a = {'name':'윤정현', 'phone':'01012341234', 'birth':'0917'}
b = a.get('name')

print(b)
>>> 윤정현

get(x) 함수는 x라는 key에 대응되는 value를 되돌려 준다.

 

get함수와 딕셔너리 변수 이름[key]로 존재하지 않는 키(nokey) 값을 가져오려 할 경우 get함수는 none 값을 출력한다.

하지만 딕셔너리 변수 이름[key]의 경우 오류가 발생한다.

 

그렇다면, 딕셔너리 안에 찾으려는 key 값이 없을 경우, 미리 정해 둔 default 값을 대신 가져오게 하고싶다면?

get(x, 'default')를 통해 설정한다

b = a.get('wideyoon', '없어')

print(b)
>>> a 딕셔너리에는 'wideyoon'에 해당하는 값이 없기때문에 default로 정해둔 '없어'가 출력됨

 

해당 key가 딕셔너리 안에 있는지 조사하기; in

a = {'name':'윤정현', 'phone':'01012341234', 'birth':'0917'}
b = 'name' in a

print(b)
>>> 존재하므로 True가 출력

b = 'email' in a

print(b)
>>> 존재하지않으므로 False가 출력

 

집합 자료형

집합 자료형은 set키워드를 이용해 만들 수 있다.

s1 = set([1,2,3])

print(s1) 
>>> {1, 2, 3}

set()의 괄호 안에 리스트를 입력하여 만든다.

 

집합 자료형의 특징은

1) 중복을 허용하지 않고,

2) 순서가 없다. (Unordered)

 

리스트나 튜플은 순서가 있기 때문에 인덱싱을 통해 자료형의 값을 얻을 수 있다.

하지만, set 자료형은 순서가 없기 때문에 인덱싱으로 값을 얻을 수 없다.

set 자료형에 저장된 값을 인덱싱으로 접근하려면 리스트나 튜플로 변환한 후 해야한다.

s1 = set([1, 2, 3])
l1 = list(s1) # 리스트로 변환

print(l1)
>>> [1, 2, 3]

a = l1[0]

print(a)
>>> 1

 

 

교집합

s1 = set([1, 2, 3, 4, 5, 6])
s2 = set([4, 5, 6, 7, 8, 9])

a = s1 & s2

print(a)
>>> {4, 5, 6}

a = s1.intersection(s2)

print(a)
>>> {4, 5, 6}

== s2.intersection(s1)

 

합집합

a = s1|s2

print(a)
>>> {1, 2, 3, 4, 5, 6, 7, 8, 9}


a = s1.union(s2)

print(a)
>>> {1, 2, 3, 4, 5, 6, 7, 8, 9}

== s2.union(s1)

 

차집합

a = s1 - s2

print(a)
>>> {1, 2, 3}

== s1.difference(s2)

b = s2 - s1

print(b)
>>> {8, 9 ,7}

== s2.difference(s1)

 

집합 자료형 관련 함수

 

값 1개 추가하기; add

s1 = set([1, 2, 3])
s1.add(4)

print(s1)
>>> {1, 2, 3, 4}

 

값 여러개 추가하기; update

s1 = set([1, 2,3])
s1.update([4, 5, 6])

print(s1)
>>> {1, 2, 3, 4, 5, 6}

 

특정 값 제거하기; remove

s1 = set([1, 2, 3])
s1.remove(2)

print(s1)
>>> {1, 3}

 

뭐 또 별거 없는 자료형 공부 끝..

오이오이 기반을 잘 다져야 좋은 코딩러가 될 수 있다구-!

ㅇㅈㄹ

 

안녕

 

728x90