세리프 따라잡기
파이썬 프로그래밍 기초: 자료형(3) 본문
튜플 자료형
리스트와 튜플의 차이점
리스트 | 튜플 |
대괄호 [] | 소괄호 () |
요소 변경 가능 [값의 생성/삭제/수정이 가능] |
요소 변경 불가능 (길이도 고정, 값도 고정) |
즉, 튜플의 핵심은 변하지 않는다는 것이다.
튜플 다루기
- 인덱싱과 슬라이싱이 가능하다.
- 더하기와 곱하기 연산이 가능하다.
- 길이 구하기가 가능하다.
튜플 예제 [+리스트와의 차이점]
Q. (1,2,3)이라는 튜플에 값 4를 추가해 (1,2,3,4) 출력a=1,2,3 print(a+(4,)) #(1, 2, 3, 4)
1. 튜플은 1개의 요소만을 가질 때는 요소 뒤에 반드시 ,를 붙여야 한다.
2. 위 코드 속 a=1,2,3처럼 괄호()를 생략해도 무방하다.
딕셔너리 자료형
루비: hash, 자바: map, 자바스크립트: object, json
= API에 자주 활용됨
- 딕셔너리를 연관 배열(Associative) 또는 해시(hash)라고도 한다.
- key를 통해 value를 얻는다. [핵심]
dic={'name':"gothic",'birth':'16 Jan','age':'뭘 알려고 해^^?'}
print(dic['age']) #뭘 알려고 해^^?
딕셔너리 쌍 추가, 삭제
a={1:'a'}
a['add']='b'
print(a) #{1: 'a', 'add': 'b'}
= a라는 딕셔너리에 key와 value를 넣으면, 새로운 네임(한 쌍)이 들어가게 된다. [리스트와는 다른 점]
a={1:'a'}
a['add']='b'
del a[1]
print(a) #{'add': 'b'}
= del을 이용해서 삭제하는 것은 리스트와 같으나, 리스트는 a[순서]를 적는 반면, 딕셔너리는 key와 value만 취급하기 때문에 a[key]를 넣어줘야 한다.
딕셔너리 만들 때 주의 사항
a={1:'a',1:'b'}
print(a) #{1: 'b'}
= key는 고유한 값이므로 중복되는 key값을 설정하면 마지막 value를 제외하고는 모두 무시가 된다.
딕셔너리 관련 함수
key 리스트 만들기(keys)
a={'name':'gothic','birth':'16 Jan','age':'secret'}
print(a.keys()) #dict_keys(['name', 'birth', 'age'])
= dict_keys 객체로 돌려줌
value 리스트 만들기 (values)
a={'name':'gothic','birth':'16 Jan','age':'secret'}
print(a.values()) #dict_values(['gothic', '16 Jan', 'secret'])
= dict_values 객체로 돌려줌
key, value 쌍 얻기 (items)
a={'name':'gothic','birth':'16 Jan','age':'secret'}
print(a.items()) #dict_items([('name', 'gothic'), ('birth', '16 Jan'), ('age', 'secret')])
= key와 value의 쌍을 튜플로 묶은 값을 dict_items 객체로 돌려줌
이들은 for문(반복문)에 많이 쓰인다.
a={'name':'gothic','birth':'16 Jan','age':'secret'}
for k, v in a.items():
print('key is '+k)
print('value is '+v)
'''
출력값=
key is name
value is gothic
key is birth
value is 16 Jan
key is age
value is secret
'''
key:value 쌍 모두 지우기 (clear)
a={'name':'gothic','birth':'16 Jan','age':'secret'}
a.clear()
print(a) #{}
= a.clear()를 통해 딕셔너리를 비울 수 있다.
key로 value 얻기 (get)
a={'name':'gothic','birth':'16 Jan','age':'secret'}
print(a.get('age')) #secret
print(a.get(2)) #None
= get은 해당 key의 value를 돌려준다. 이때 없는 key값을 가져오려 한다면, get은 none이라는 '거짓'을 돌려준다. 이때 key값이 없을 경우 미리 정해 둔 디폴트 값을 대신 가져오게 하면 편리하다. a.get(key값,'디폴트 값')
a={'name':'gothic','birth':'16 Jan','age':'secret'}
print(a.get(2, "nonexistent")) #nonexistent
+ get과 비슷하게 값을 가져오는 대괄호[]를 없는 key값을 가져오는데 이용하면 KeyError라는 에러가 발생한다.
해당 key가 딕셔너리 안에 있는지 조사 (in)
a={'name':'gothic','birth':'16 Jan','age':'secret'}
print(3 in a) #False
print('name' in a) #True
= 3이 a 안에 없으니 거짓이, name이 a 안에 있으니 진실이 반환 → 뒤에 배울 bool 자료형의 참과 거짓으로 나타남.
∴ 딕셔너리의 핵심은 키(key)를 이용해서 빠르게 찾을 수 있다는 것.
집합 자료형
집합의 핵심: 중복된 요소를 가질 수 없다 = 원소가 각각 고유함. ≠ [1, 2, 2]
- 집합에 관련된 것들을 쉽게 처리하기 위해 만들어짐
- 중복 허용X
- 순서가 없다(Unordered) = 순서 없이 요소들이 각각
s1=set([1,2,3])
print(s1) #{1, 2, 3}
집합을 만드는 방법
1. 위의 코드와 같이 set(집합) 키워드 사용
2. s1={1,2,3}이라고 중괄호에 감싸서 집합을 정의
실 활용 예시 [데이터 다룰 때?]
a=[1,2,2,2,3,3,4]
newlist=list(set(a)) #newlist에 set을 하여 중복을 제거한 a를 list하여 print함
print(newlist) #[1, 2, 3, 4]
s1=set('hello')
print(s1) #{'o', 'h', 'l', 'e'}
중복은 제거 되고 뒤죽박죽으로 출력이 되는데, 이를 통해서도 순서가 없이 원소들이 각각 있으며 중복이 없다는 것을 알 수 있음.
교집합
a=set([1,2,3,4,5,6])
b=set([4,5,6,7,8,9])
print(a&b) #{4, 5, 6}
#또는
print(a.intersection(b)) #{4, 5, 6}
= 다른 언어에서는 복잡하게 구현해야 하는 교집합 구하기가, 여기서는 & 기호로 간단히 구할 수 있다. 또는 위 코드에 입력한 것과 같이 .intersection 함수를 사용해도 된다. [결과는 같음]
합집합
a=set([1,2,3,4,5,6])
b=set([4,5,6,7,8,9])
print(a|b) #{1, 2, 3, 4, 5, 6, 7, 8, 9}
#또는
print(a.union(b)) #{1, 2, 3, 4, 5, 6, 7, 8, 9}
= 합집합 또한 | 기호와 .union 함수를 이용해 쉽게 구할 수 있다.
차집합
a=set([1,2,3,4,5,6])
b=set([4,5,6,7,8,9])
print(a-b) #{1, 2, 3}
print(a.difference(b)) #{1, 2, 3}
= 차집합도 직관적인 기호를 통해 구할 수 있다. - 기호와 .difference 함수를 이용
집합 자료형 관련 함수
- 값 1개 추가하기 (add)
a=set([1,2,3,4,5,6])
a.add(7)
print(a) #{1, 2, 3, 4, 5, 6, 7}
- 값 여러 개 추가하기 (update)
a=set([1,2,3,4,5,6])
a.update([7,8,9,1])
print(a) #{1, 2, 3, 4, 5, 6, 7, 8, 9}
= 이때 중복 값 1을 넣어주면 출력된 코드와 같이, 중복이 제외되고 나머지가 들어간다.
- 특정 값 제거하기 (remove)
a=set([1,2,3,4,5,6])
a.remove(1)
print(a) #{2, 3, 4, 5, 6}
= 특정 값 제거는 1개만 가능하다. 여러 개를 넣을 시 오류 발생!
불 자료형 (=불리언)
참(true)과 거짓(false)으로 이루어짐
a=True
print(type(a)) #<class 'bool'>
b=False
print(type(b)) #<class 'bool'>
자료형의 참과 거짓 구분 기준
자료형 | 값 | 참(T) or 거짓(F) |
문자열 | "python" | T |
"" | F | |
리스트 | [1,2,3] | T |
[] | F | |
튜플 | () | F |
딕셔너리 | {} | F |
숫자형 | 0이 아닌 숫자 | T |
0 | F | |
None | F |
= 값이 있으면 참, 없으면 거짓이라고 생각한다.
a='hungry'
if a:
print(a) #hungry
= ''안에 문자열이 담겼기 때문에 오류가 날 것 같지만, 앞서 언급했듯 값이 있으면 참으로 인식하기 때문에, hungry가 출력된다.
+ ex.
a=[1,2,3,4]
while a:
a.pop()
print(a)
'''
출력 결과
[1, 2, 3]
[1, 2]
[1]
[]
'''
= while문을 이용해 보면 다음과 같은 결과가 나는 이유는, a의 값이 참일 동안 pop을 반복했고, pop의 반복으로 인해 리스트 안에 요소가 사라졌기/없어졌기 때문에(=거짓) 출력이 끝난 것이다. [만약 pop없이 돌렸다면 계~속해서 a가 출력]
변수 [간단하게만]
파이썬에서 사용하는 변수는 객체를 가리키는 것
객체란: class를 이용해서 만든 것(=자료형), 객체가 있으면 method을 이용해서 함수 적용 가능
* 리스트를 복사할 때
a=[1,2,3]
b=a
a[1]=4
print(b) #[1,4,3]
= 이것은 말 그대로 복사를 하는 것이 아닌, a와 b가 같은 '주소'를 가리키고 있기 때문에 출력 값이 같은 것이다.
a=[1,2,3]
b=a
a[1]=4
print(id(a)) #2462936227264
print(id(b)) #2462936227264
= id()를 통해 b가 a를 가리키는 것이기 때문에, a의 주소값과 똑같이 나옴
a=[1,2,3]
b=a
a[1]=4
print(a is b) #True
= a is b를 통해 가리키는 것이 같은지, 즉 같은 주소인지를 물어본다. 같다면 true가 출력
그렇다면 진짜 복사를 하려면 어떻게 해야하는가? [b는 a값([1,2,3]) 그대로 하고 싶다]
1. [:] 슬라이싱 사용
a=[1,2,3]
b=a[:]
a[1]=4
print(a) #[1,4,3]
print(b) #[1,2,3]
#id값을 통해 주소 확인
print(id(a)) #1477062974912
print(id(b)) #1477063013248
= 슬라이싱을 하면 새로운 [1,2,3] 리스트가 생겨서 b에 값이 넣어짐. 즉, 진짜 복사가 된 것이기에 a 리스트 값을 바꾸더라도 b에 영향을 끼치지 않는다.
2. copy 모듈 사용
from copy import copy
a=[1,2,3]
b=copy(a)
a[1]=4
print(a) #[1,4,3]
print(b) #[1,2,3]
#주소 확인
print(id(a)) #2132180790848
print(id(b)) #2132180635712
= 이 방법(b=copy(a))은 위의 방법(b=a[:])과 동일하다.
변수를 만드는 여러 가지 방법
1. 튜플 이용
a,b=('left', 'right') #튜플은 괄호를 생략해도 됨 a,b == (a,b)
print(a) #left
print(b) #right
2. 리스트 이용
[a,b]=['left','right']
print(a) #left
print(b) #right
3. 여러 개의 변수에 같은 값을 대입할 때
a=b='twice'
print(a) #twice
print(b) #twice
4. 두 변수의 값을 바꾸기
a='one'
b='two'
a,b=b,a
print(a) #two
print(b) #one
= 다른 언어와 같은 경우, tmp(임시 변수)를 거쳐서 바꾸기에 파이썬에 비해 복잡하다. 파이썬에선 튜플을 이용해 직관적으로 간단하게 바꿀 수 있다.
'Python' 카테고리의 다른 글
파이썬 프로그램의 구조 쌓기: 제어문(1) (0) | 2021.05.15 |
---|---|
파이썬 프로그래밍 기초: 자료형(2) (0) | 2021.05.13 |
파이썬 프로그래밍 기초: 자료형(1) (0) | 2021.05.11 |
파이썬에 대해 (0) | 2021.05.10 |