본문 바로가기

Programing/Python

[Python 입문] 5. 파이썬 자료형 - 튜플, 딕셔너리, 집합

목차

  • 리스트와 튜플의 사용 범위
  • 튜플의 인덱싱과 슬라이싱, 더하기(+)와 곱하기(*)
  • 딕셔너리 쌍 추가, 삭제
  • 딕셔너리 사용 방법
  • 딕셔러니 만들 때 주의사항
  • 딕셔너리 관련 함수
  • 집합 자료형 특징
  • 집합 자료형 활용 방법
  • 집합 자료형 관련 함수

튜플 (Tuple)

>>> t1 = ()
>>> t2 = (1,)   <---- 1개의 요소만을 가질때는 요소 뒤에 콤마(,)가 꼭 필요
>>> t3 = (1, 2, 3)
>>> t4 = 1, 2, 3   <---- 괄호 생략 가능
>>> t5 = ('a', 'b', ('ab', 'cd'))

 튜플(Tuple)은 리스트와 거의 비슷하지만 리스트는 대괄호[ ]로 둘러싸지만 튜플은 괄호( )로 둘러싼다. 그리고 리스트는 값을 생성, 삭제, 수정할 수 있지만 튜플은 값을 바꿀 수 없다.

 

1. 리스트와 튜플의 사용 범위

     - 프로그램이 실행되는 동안 그 값이 항상 편하지 않기를 바라거나 바뀔까 걱정되면 튜플(Tuple)

     - 수시로 그 값을 변화시켜야 할 경우는 리스트(List)

 실제 프로그램에는 값이 변경되는 형태가 더 많기 때문에 튜플보다는 리스트를 더 많이 사용한다고 한다.

# 튜플 요소값 삭제 시 오류
>>> t1 = (1, 2, 'a', 'b')
>>> del t1[0]   <---- 튜플 t1의 첫 번째 요소 삭제 시도
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object doesn't support item deletion
# 튜플 요소값 변경 시 오류
>>> t1 = (1, 2, 'a', 'b')
>>> t1[0] = 'c'   <---- 튜플 t1의 첫 번째 요소 변경 시도
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment

 튜플의 요소 값을 삭제 또는 변경을 시도할 경우 위 소스코드들과 같은 오류가 발생한다.

 

2. 튜플의 인덱싱과 슬라이싱, 더하기 (+)와 곱하기(*)

 튜플의 변화가 불가능 하지만 다른 부분 (인덱싱, 슬라이싱 등)은 리스트와 완전히 동일하다.

# 튜플 인덱싱
>>> t1 = (1, 2, 'a', 'b')
>>> t1[0]
1

# 튜플 슬라이싱
>>> t1 = (1, 2, 'a', 'b')
>>> t1[1:]   <---- t1의 요소 중 두 번째 부터 끝까지
(2, 'a', 'b')

# 튜플 더하기
>>> t1 = (1, 2, 'a', 'b')
>>> t2 = (3, 4)
>>> t1 + t2   <---- (1, 2, 'a', 'b') + (3, 4)
(1, 2, 'a', 'b', 3, 4)

# 튜플 곱하기
>>> t2 = (3, 4)
>>> t2 * 3
(3, 4, 3, 4, 3, 4)

 

딕셔너리 (Dictionary)

 딕셔너리는 Key와 Value의 한 쌍으로 이루어진 자료형이다. 예를 들면 "이름" = "홍길동"이 된다. 또한 딕셔너리는 리스트나 튜플처럼 순서대로 요소 값을 구하는 것이 아니라 Key를 통해 Value를 얻는다. 순차적으로 모두 검색하는 것이 아니라 "이름"이라는 단어가 있는 곳만 검색한다.

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

 딕셔너리는 Key와 Value의 쌍 여러 개가 중괄호{ }로 둘러싸여 있다. Key는 변하지 않는 값을 사용하고, Value는 변하는 값과 변하지 않는 값 모두를 사용할 수 있다.

>>> dic = {'name':'pey', 'phone':'01012341234', 'birth':'1007'}

>>> a = {1:'hi'}   <---- Key에 정수값1, Value에 문자열'hi' 사용

>>> a = {'a':[1, 2, 3]}   <---- Value에 리스트를 사용

 위 소스코드는 딕셔너리의 기본 예와 몇가지 사용 방법을 보여준다. 이 딕셔너리 중 dic을 표로 풀어보면 아래와 같다.

Key Value
name pey
phone 01012341234
birth 1007

 

1. 딕셔너리 쌍 추가, 삭제

# 딕셔너리 쌍 추가
>>> a = {1:'a'}
>>> a[2] = 'b'   <---- {2:'b'} 쌍 추가
>>> a
{1: 'a', 2: 'b'}
>>> a['name'] = 'pey'   <---- {'name':'pey'} 쌍 추가
>>> a
{1: 'a', 2: 'b', 'name': 'pey'}
>>> a[3] = [1, 2, 3]   <---- {3:[1, 2, 3]} 쌍 추가
>>> a
{1: 'a', 2: 'b', 'name': 'pey', 3: [1, 2, 3]}

# 딕셔너리 요소 삭제 (위에서 사용한 튜플 연결)
>>> del a[1]   <---- Key값이 1인 Key:Value 삭제
>>> a
{2: 'b', 'name': 'pey', 3: [1, 2, 3]}

 

2. 딕셔너리 사용 방법

# 딕셔너리의 Key를 사용해 Value값 얻기
>>> grade = {'pey':10, 'juliet':99}
>>> grade['pey']   <---- Key가 'pey'인 Value 반환
10
>>> grade['juliet']   <---- Key가 'juliet'인 Value 반환
99

# 딕셔너리에서 [ ]안의 숫자는 두 번째 요소를 뜻하는 것이 아니다. Key에 해당하는 숫자를 나타낸다.
>>> a = {1:'a', 2:'b'}
>>> a[1]   <---- Key가 1인 Value 반환
'a'
>>> a[2]   <---- Key가 2인 Value 반환
'b'

>>> a = {'a':1, 'b':2}
>>> a['a']
1
>>> a['b']
2

 리스트나 튜플 문자열은 요소값을 얻기 위해 인덱싱 또는 슬라이싱 기법을 사용했지만 딕셔너리는 인덱싱 기법을 사용할 수 없다.

 Key를 사용해서 Value를 얻어내는 방법만 가능하다.

 아래의 소스코드 예시를 보면 더 이해하기 쉽다.

>>> dic = {'name':'pey', 'phone':'01012341234', 'birth':'1007'}
>>> dic['name']
'pey'
>>> dic['phone']
'01012341234'
>>> dic['birth']
'1007'

 

3. 딕셔너리 만들때 주의사항

# Key값의 중복사용 금지
>>> a = {1:'a', 1:'b'}   <---- Key값에 1이라는 중봅 값 사용
>>> a[1]   <---- Key값이 1인 Value 반환
'b'
>>> a
{1: 'b'}   <---- 1개를 제외한 나머지 값 모두 무시

# Key값에 리스트 사용 불가 (단, 튜플은 사용 가능)
>>> a = {[1, 2]:'hi'}   <---- 리스트를 Key에 사용
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'   <---- 오류 발생

# Key값에 튜플 사용 테스트
>>> a = {(1, 2):'hi'}   <---- 튜플을 Key에 사용
>>> a
{(1, 2): 'hi'}

 딕셔너리 Key값에 튜플은 왜 사용이 가능할까? Key가 변하지 않는 값만 사용할 수 있기 때문에 수정할 수 없는 튜플은 사용할 수 있다. (Value에는 변하는 값이나 변하지 않는 값이나 상관없이 사용할 수 있다.)

 

4. 딕셔너리 관련 함수

 딕셔너리 역시 자체적으로 가지고 있는 함수들이 있다.

>>> a = {'name':'pey', 'phone':'01012341234', 'birth':'1007'}

# Key 리스트 만들기 (keys)
>>> a.keys()
dict_keys(['name', 'phone', 'birth'])   <---- dict_keys라는 객체를 리턴

# dict_keys를 리스트로 변환 (보너스)
>>> list(a.keys())
['name', 'phone', 'birth']

# Value 리스트 만들기 (values)
>>> a.values()
dict_values(['pey', '01012341234', '1007'])   <---- 리스트로 변환은 dict_keys와 같은 방법으로 가능하다.

# Key, Value 쌍 얻기 (items)
>>> a.items()
dict_items([('name', 'pey'), ('phone', '01012341234'), ('birth', '1007')])   <---- 튜플로 묵은 값을 dict_items 객체로 리턴

# Key:Value 쌍 모두 삭제 (clear)
>>> a.clear()
>>> a
{}   <---- 빈 튜플을 표현하는 것과 같이 딕셔너리가 비었다는 뜻

# Key로 Value 얻기 (get)
>>> a = {'name':'pey', 'phone':'01012341234', 'birth':'1007'}
>>> a.get('name')
'pey'
>>> a.get('phone')
'01012341234'
>>> a.get('nokey')   <---- get사용해서 없는 Key값 반환 명령 시 None으로 리턴
>>> a['nokey']   <---- 일반적인 방법으로 없는 Key값 반환 명령 시 오류 발생
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'nokey'

# Key값이 없는 경우 정해 둔 디폴트값을 대신 가져오기
>>> a = {'name':'pey', 'phone':'01012341234', 'birth':'1007'}
>>> a.get('foo', 'bar')   <---- get('key값', '디폴트값')
'bar'   <----  불러오고자 하는 Key값 'foo'가 없기 때문에 디폴트값 'bar' 리턴

# 해당 Key가 딕셔너리에 있는지 조사 (in)
>>> a = {'name':'pey', 'phone':'01012341234', 'birth':'1007'}
>>> 'name' in a
True   <---- 딕셔너리에 존재하면 True
>>> 'mail' in a
False   <---- 딕셔너리에 존재하지 않으면 False

 

집합

>>> s1 = set([1, 2, 3])   <---- set()에 리스트 입력
>>> s1
{1, 2, 3}

>>> s2 = set("Hello")   <---- set()에 문자열 입력
>>> s2
{'l', 'e', 'H', 'o'}

 

1.  집합 자료형 특징

     1. 집합 자료형은 중복을 허용하지 않는다.

        - 위 소스코드를 보면 "Hello"의 집합에 2개가 있었던 'l' 문자가 하나만 있다.

     

     2. 집합 자료형은 순서가 없다.

        - set 자료형은 리스트나 튜플과 다르게 순서가 없기 때문에 인덱싱으로 값을 얻을 수 없다.

        - 딕셔너리와 같이 순서가 없는 자료형이기 때문에 인덱싱을 지원하지 않는다.

>>> s1 = set([1, 2, 3])
>>> l1 = list(s1)   <---- s1 집합 자료형을 리스트로 변환
>>> l1
[1, 2, 3]
>>> l1[0]   <---- 리스트로 변환된 l1의 인덱싱
1
>>> t1 = tuple(s1)   <---- s1 집합 자료형을 튜플로 변환
>>> t1
(1, 2, 3)
>>> t1[0]   <---- 튜플로 변환된 t1의 인덱싱
1

 set 자료형에 저장된 값을 인덱싱 하기 위해서는 위의 소스코드와 같이 리스트나 튜플로 변환한 후 할 수 있다.

 

2. 집합 자료형 활용 방법

 set 자료형은 교집합, 합집합, 차집합을 구할 때 사용할 수 있다.

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

# 교집합 (&, intersection)
>>> s1 & s2   <---- 기호 '&'를 사용한 교집합
{4, 5, 6}
>>> s1.intersection(s2)   <---- 함수 intersection을 사용한 교집합
{4, 5, 6}

# 합집합 (|, union)
>>> s1 | s2   <---- 기호 '|'를 사용한 합집합
{1, 2, 3, 4, 5, 6, 7, 8, 9}
>>> s1.union(s2)   <---- 함수 union을 사용한 합집합
{1, 2, 3, 4, 5, 6, 7, 8, 9}

# 차집합 (-, difference)
>>> s1 - s2   <---- 기호 '-'를 사용한 차집합
{1, 2, 3}
>>> s1.difference(s2)   <---- 함수 difference를 사용한 차집합
{1, 2, 3}

 

3. 집합 자료형 관련 함수

 집합 자료형 역시 다른 자료형들과 같이 자체적으로 가지고 있는 함수들이 있다.

# 1개 값 추가 (add)
>>> s1 = set([1, 2, 3])
>>> s1.add(4)   <---- 1개의 값만 추가할 경우 값 자체만 입력
>>> s1
{1, 2, 3, 4}

# 여러개 값 추가 (update)
>>> s1 = set([1, 2, 3])
>>> s1.update([4, 5, 6])   <---- 여러개의 값을 한번에 추가할 때
>>> s1
{1, 2, 3, 4, 5, 6}

# 특정 값 제거 (remove)
>>> s1 = set([1, 2, 3])
>>> s1.remove(2)   <---- 제거하고자 하는 특정 값 입력
>>> s1
{1, 3}

 

 

내용 출처: 책 '점프 투 파이썬'의 내용