2021.3.2 TIL : [Python] 기초 문법3
<튜플(Tuple) 자료형>
튜플 자료형은 리스트와 비슷하지만, 변경이 불가능하다는 점에서 리스트와 다른 자료형이다. 즉, 원소를 추가하거나 변경, 혹은 삭제가 불가능한 길이와 값이 모두 고정되어 있는 자료형이라고 볼 수 있다. 리스트는 [] 대괄호를 사용해서 표현해줬던 반면, 튜플은 () 소괄호를 사용해서 표현해 준다. 다만, 변화시키는 것은 안 되지만, 보는 것은 가능하기 때문에 인덱싱이나 슬라이싱은 가능하다. 또한, 곱하기와 더하기 기능은 사용 가능하다.
<딕셔너리(Dictionary)>
키(key)와 값(value)이 하나로 묶여 저장되는 형태이다. 그 값을 찾기 위해서 해당하는 키를 찾을 수 있다. API에서 자주 활용된다. 다른 서버에 어떤 정보를 요청했을 때, 주로 딕셔너리의 형태로 그 연관된 값을 응답하는 경우이다. 이는 연관 배열(Associate array) 혹은 해시(Hash)라고도 불린다. 리스트처럼 원소 값 추가하기 / 삭제하기가 모두 가능하며 삭제할 때는 del a[삭제할 값의 키] 를 적어주면 된다. 주의해야 할 점은, 키는 하나의 값 만을 가리킬 수 있기 때문에 같은 딕셔너리 안에서 키의 중복이 존재하면 안 된다. (값은 서로 같을 수 있다.)
키만 따로 출력할 수도 있다. 딕셔너리_이름.keys()를 이용하면 key 값만 따로 확인할 수 있다. 마찬가지로 딕셔너리_이름.values() 를 이용하면 value 값만 따로 확인하는 것도 가능하다. 또한, 딕셔너리_이름.items() 를 통해 새로운 배열 안의 튜플 형태로 key와 value 쌍을 담을 수도 있다. 마지막으로, clear함수를 통해서 딕셔너리 안을 비워줄 수도 있다.
a = {'name' : '개린이', 'status' : '입문자', 'phone' : '010-0000-0000'}
print(a.keys())
#출력값 : dict_keys(['name', 'status', 'phone'])
print(a.values())
#출력값 : dict_values(['개린이', '입문자', '010-0000-0000'])
print(a.items())
#출력값 : dict_items([('name', '개린이'), ('status', '입문자'), ('phone', '010-0000-0000')])
a.clea()
print(a)
#출력값 : {}
어떤 키에 해당하는 값이 무엇인지를 묻는 방법은 대표적으로 두가지가 있는데, 아래와 같다. 이 둘은 물어보는 키가 해당 딕셔너리에 없을 때 차이가 나는데, 첫 번째 방법은 찾으려는 키가 딕셔너리에 없는 경우 에러가 나는 반면, get()은 찾으려는 키가 없으면 none 을 반환한다. 이 때 get(찾으려는 키 값, '찾으려는 키가 없는 경우 반환할 값')으로 함수를 구성해서 none 대신 다른 디폴트 반환값을 정해줄 수도 있다. 마지막으로 해당하는 키가 있는지 여부만을 파악하기 위해서 in을 사용할 수도 있다. 이 때는 있다와 없다 단 두 가지 값만을 가지기 때문에 True 혹은 False로 값이 반환된다. 딕셔너리의 가장 큰 핵심은 키를 이용해서 벨류를 빠르게 찾을 수 있다는 점이다.
a = {1: 'a', 2: 'b', 3:'c'}
print(a[4])
#위 값은 에러가 발생
print(a.get(4))
#출력값 : none
print(4 in a)
#출력값 : False
<집합(set) 자료형>
우리가 수학에서 배운 집합을 쉽게 처리하기 위해 파이썬에서 만든 자료형으로 볼 수 있다(다른 언어에는 없는 경우도 많다). 리스트와는 달리 한 집합 안에 중복되는 원소를 가질 수 없고, 원소의 순서가 없다(unordered). 집합을 정의하는 방법에는 여러 가지가 있는데, 리스트(배열)로 들어갈 원소를 정의해두고 set()으로 집합임을 명시해 줄 수 있다. 혹은 {} 중괄호를 이용하여 원소들을 바로 표현해 줄 수도 있다. 집합을 이용하면, 리스트의 중복된 원소들을 없애주는 역할을 할 수 있다.
a = set([1, 2, 3])
print(a)
#출력값 : {1, 2, 3}
a = {1, 2, 3}
print(a)
#출력값 : {1, 2, 3}
l = [1, 2, 3, 3, 3, 4]
newList = list(set(l))
print(newList)
#출력값 : [1, 2, 3, 4]
문자열을 집합에 넣어 각 문자를 원소로 가지게 할 수도 있다. 이 때, 문자들이 출력되는 값이 순서가 없으며 중복이 없다는 점에서 집합의 특성을 알 수 있다. 또한, 교집합 기능을 & 으로 사용할 수 있다. 두 집합에 공통적으로 포함된 원소들을 반환해주는 것이다. 합집합 기능을 |로 사용할 수도 있다. 두 개 이상의 집합에 포함된 모든 원소를(중복되지 않도록 한 번씩만) 반환하게 해준다. 합집합은 union(합할 다른 집합)으로 표현할 수도 있다. 차집합도 함수로 구현이 가능하다. s1.difference(s2))로 하는 경우 s1 집합에서 s2 집합을 빼주는 것으로 s1 집합에서 s1과 s2의 교집합을 빼는 것으로 이해할 수 있다.
set1 = set("Hello")
print(s1)
#출력값 : {'e', 'H', 'l', 'o'}
s1 = {1, 2, 3, 4, 5, 6}
s2 = {4, 5, 6, 7, 8, 9}
print(s1 & s2)
#출력값 : {4, 5, 6}
print(s1 | s2)
#출력값 : {1, 2, 3, 4, 5, 6, 7, 8, 9}
print(s1.union(s2))
#출력값 : {1, 2, 3, 4, 5, 6, 7, 8, 9}
print(s1.difference(s2))
#출력값 : {1, 2, 3}
튜플과 달리, 집합은 원소를 추가할 수 있다. 이 때, 순서가 없기 때문에 1개씩 추가할 수도 있고, 여러 개씩 추가하는 것도 가능하다. add(추가할 원소)를 이용하면 하나의 원소를 추가할 수 있다. add 함수 자체는 행위로, 반환해주는 값이 없으므로 print(s.add(7))로는 어떤 값도 출력할 수 없다. update([추가하고 싶은 원소들])을 이용해서 여러 개의 원소를 한 번에 추가할 수도 있다. 마지막으로 remove(삭제하고 싶은 원소) 함수를 이용해서 원하는 원소를 삭제할 수도 있다.
s = {1, 2, 3, 4, 5, 6}
s.add(7)
print(s)
#출력값 : {1, 2, 3, 4, 5, 6, 7}
s.update([8, 9, 10])
print(s)
#출력값 : {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
s.remove(4)
print(s)
#출력값 : {1, 2, 3, 5, 6, 7, 8, 9, 10}