세리프 따라잡기

파이썬 프로그래밍 기초: 자료형(3) 본문

Python

파이썬 프로그래밍 기초: 자료형(3)

맑은 고딕 2021. 5. 14. 19:52

튜플 자료형

리스트와 튜플의 차이점

리스트 튜플
대괄호 [] 소괄호 ()
요소 변경 가능
[값의 생성/삭제/수정이 가능]
요소 변경 불가능
(길이도 고정, 값도 고정)

즉, 튜플의 핵심변하지 않는다는 것이다.

 

튜플 다루기

- 인덱싱과 슬라이싱이 가능하다.

- 더하기와 곱하기 연산이 가능하다.

- 길이 구하기가 가능하다.

 

튜플 예제 [+리스트와의 차이점]

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을 이용해서 함수 적용 가능

값을 시각적으로 보여주는 사이트 

= 1값을 가진 변수 a는 주소 2026043360을 가리킨다.

* 리스트를 복사할 때

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(임시 변수)를 거쳐서 바꾸기에 파이썬에 비해 복잡하다. 파이썬에선 튜플을 이용해 직관적으로 간단하게 바꿀 수 있다.

Comments