안녕하세요 오늘도 파이썬 (python) 강좌 세번째 튜플, 딕셔너리, 그리고 집합자료형의 대해서 알아보도록 하겠습니다.

파이썬강좌튜플 딕셔너리자료루조형

튜플

튜

튜플(Tuple)은 몇가지 점을 제외하고 리스트와 거의 비슷합니다. 리스트와 다른 점은 다음과 같습니다.

  • 리스트는 [ ]로 둘러싸여 있지만 튜플은 ( )로 둘러싸여 있습니다.
  • 리스트는 그 값의 생성, 삭제, 수정이 가능하지만 튜플은 그 값을 바꿀 수 있습니다.

튜플 만들기

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

리스트와 비슷해 보이지만, 튜플에서는 리스트와 다른 두 가지 차이점을 찾을 수 있습니다

t2 = (1,)처럼 단지 1개의 요소만을 가질 때는 요소 뒤에 콤마(,)를 반드시 붙여야 합니다.
t4 = 1, 2, 3처럼 괄호( )를 생략해도 무방합니다.
튜플과 리스트는 비슷한 역할을 하지만, 프로그래밍할 때 튜플과 리스트를 구별해서 사용하는 것이 유리합니다. 튜플과 리스트의 가장 큰 차이는 값을 변화시킬 수 있냐의 가능 여부입니다. 즉, 리스트의 항목 값은 변화가 가능하고, 튜플의 항목 값은 변화가 불가능합니다. 따라서 프로그램이 실행되는 동안 그 값이 항상 변하지 않기를 바란다면 튜플을 사용하면 됩니다.

반대로, 값의 변화가 필요하다면 리스트를 사용해야 합니다. 사실 프로그램에서 값이 유동적으로 바뀌는 경우가 많기 때문에 튜플보다는 리스트를 더 많이 사용합니다.

튜플의 요소 삭제와 수정

앞에서 설명 했듯이 튜프의 요소 값은 한 번 정하면 지우거나 변경할 수 없습니다. 다음 예시를 보면 확인 할 수 있습니다.

튜플 요소값 삭제

t1 = (1, 2, 'a', 'b')
del t1[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object doesn't support item deletion

튜플의 요소를 리스트처럼 ‘del’ 함수로 지우려고한 예시입니다. 튜플은 요소를 지우는것이 불가능하다는 에러를 확인할 수 있습니다.

튜플 요소값 수정

t1 = (1, 2, 'a', 'b')
t1[0] = 'c'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment

튜플의 요소 값을 변경하려고 해도 마찬가지 입니다. 오류가 발생하느것을확인 할 수 있습니다.

튜플 다루기

튜플은 값을 변화시킬 수 없다는 점만 제외한다면 리스트와 완전히 동일합니다. 간단하게만 알아보도록 하겠습니다. 다음 예제는 서로 연관되어 있어서 차례대로 수행하는것을 추천드립니다.

인덱싱

t1 = (1, 2, 'a', 'b')
t1[0]
# 결과: 1
t1[3]
# 결과: 'b'

문자열, 리스트와 마찬가지로 t1[0], t1[3]처럼 인덱싱이 가능합니다.

슬라이싱

t1 = (1, 2, 'a', 'b')
t1[1:]
# 결과: (2, 'a', 'b')

t1[1]부터 튜플의 마지막 요소까지 슬라이싱하는 예입니다.

튜플 더하기

t1 = (1, 2, 'a', 'b')
t2 = (3, 4)
t1 + t2
# 결과: (1, 2, 'a', 'b', 3, 4)

튜플 곱하기

t2 = (3, 4)
t2 * 3
# 결과: (3, 4, 3, 4, 3, 4)

튜플 길이 구하기

t1 = (1, 2, 'a', 'b')
len(t1)
# 결과: 4

딕셔너리 자료형

딕셔너리

딕셔너리는 무엇일까요? 사람은 누구든지 ‘이름’ = ‘홍길동’, ‘생일’ = ‘몇월 며칠’ 등으로 구별할 수 있습니다. 파이썬은 영리하게도 이런 대응 관계를 나타낼 수 있는 자료형을 가지고 있습니다. 요즘 사용하는 대부분의 언어도 이러한 대응 관계를 나타내는 자료형을 갖고 있는데, 이를 연관 배열이라고 합니다.

파이썬에서는 이런 자료형을 딕셔너리(Dictionary)라고 합니다. 단어 그대로 해석하면 사전이라는 뜻입니다. 즉, ‘people’이라는 단어에 ‘사람’, ‘baseball’이라는 단어에 ‘야구’라는 뜻이 부합되듯이 딕셔너리는 key와 value로 한 쌍을 가지는 자료형입니다. 예컨대 key가 ‘baseball’이라면 value는 ‘야구’가 될 것입니다.

딕셔너리는 리스트나 튜플처럼 순차적으로 대응 요소 값을 구하지 않고, key를 통해서 value를 얻습니다. 이것이 바로 딕셔너리의 가장 큰 특징입니다.

딕셔너리 만들기

딕셔너리의 기본적인 형태는 아래를 보면확인 할 수 있습니다.

{key1: value1, key2: value2, key3: value3, ...}

key와 value의 쌍 여러개가 {}로 둘러싸여 있는데요 각각의 요소는 key : value의 형태로 이루어져 있습니다.

  • 주의해야할 것 : key에는 변하지 않는 값을 사용하고 value에는 변하는 값과 변하지 않는 값 모두 사용할 수 있습니다.

딕셔너리 예시

dic = {'name': 'pey', 'phone': '010202039904', 'birth': '1112'}

위에서 key는 각각 ‘name’, ‘phone’, ‘birth’입니다. 각각의 key에 해당하는 value는 ‘pey’, ‘010202039904’, ‘1112’입니다.

다음 예로 key로 정수값 1, value로 문자열 ‘hi’를 사용하는 예를 알아보도록 하겠습니다.

a = {1: 'hi'}

또 다음 예시 처럼 리스트를 넣을 수도 있습니다. 아래를 참고하세요.

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

딕셔너리 쌍 추가 및 삭제

딕셔너리 쌍 추가하기

a = {1: 'a'}
a[2] = 'b'
a
# 결과: {1: 'a', 2: 'b'}

a['name'] = 'pey'
a
# 결과: {1: 'a', 2: 'b', 'name': 'pey'}

a[3] = [1, 2, 3]
a
# 결과: {1: 'a', 2: 'b', 'name': 'pey', 3: [1, 2, 3]}

딕셔너리 요소 삭제하기

del a[1]
a
# 결과: {2: 'b', 'name': 'pey', 3: [1, 2, 3]}

딕셔너리 사용하는 방법

딕셔너리는 주로 어떤것을 표현하는데 사용할까요? 예를들어서 4명의 사람이 있다고 가정한다면, 각각의 특기를 표현할 수 있는 좋은방법에대해서 생각한다면 리스트나 문자열로는 표현하는데 어려움이 있습니다. 하지만 파이썬의 딕셔너리를 사용한다면 이상황을 표현하기가 굉장히 쉽습니다.

{'김연아': '피겨스케이팅', '류현진': '야구', '박지성': '축구'}

딕셔너리에서 key를 사용해서 value

grade = {'pey': 10, 'julliet': 99}
grade['pey']
# 결과: 10
grade['julliet']
# 결과: 99

리스트나 튜플, 문자열은 요소 값을 얻고자 할 때 인덱싱이나 슬라이싱 기법 중 하나를 사용했습니다. 하지만 딕셔너리는 단 한 가지 방법뿐입니다. 바로 key를 사용해서 value를 구하는 방법입니다. 위 예에서 ‘pey’라는 key의 value를 얻기 위해서 grade[‘pey’]처럼 작성하면 됩니다.

딕셔너리 만들때 주의사항

a = {1: 'a', 1: 'b'}
a
# 결과: {1: 'b'}

1이라는 key값이 중복되어 1 : ‘a’쌍이 무시가 됩니다. 따라서 중복되는 key값을 사용하지 않도록 주의해야합니다.

key에 리스트는 사용할 수 없지만 튜플은 사용할 수 있습니다. 튜플은 그값이 변하지 않으므로 key로 사용할 수 있지만 리스트는 그 값이 변할 수 있기때문에 key로 사용할 수 없습니다. 다음 예를 참고하세요.

a = {[1, 2]: 'hi'}
# 결과: TypeError: unhashable type: 'list'

리스트를 key로 사용하려고 했더니 ‘unhashable type’이라는 오류 메시지가 발생합니다

a = {(1, 2): 'hi'}
# 결과: {(1, 2): 'hi'}

딕셔너리 관련 함수

딕셔너리함수

딕셔너리를 자유자재로 사용하기 위해 딕셔너리와 관련된 유용한 함수들을 소개합니다.

key 리스트 만들기(keys)

a = {'name': 'pey', 'phone': '010202039904', 'birth': '1112'}
a.keys()
# 결과: dict_keys(['name', 'phone', 'birth'])

a.keys()는 딕셔너리 a의 key만을 모아서 dict_keys 객체를 돌려줍니다. dict_keys 객체는 리스트를 사용하는 것과 차이가 없지만, 리스트 고유의 append, insert, pop, remove, sort 함수는 사용할 수 없습니다.

for k in a.keys():
    print(k)
# 결과: 
# name
# phone
# birth

a.keys()처럼 딕셔너리의 key를 얻은 다음, 이를 반복해서 출력할 수 있습니다.

dict_keys 객체를 리스트로 변환하려면 다음과 같이 하면 됩니다.

value 리스트 만들기(values)

a.values()
# 결과: dict_values(['pey', '010202039904', '1112'])

a.values()는 딕셔너리 a의 value만을 모아서 dict_values 객체를 돌려줍니다.

key, value 쌍 얻기(items)

a.items()
# 결과: dict_items([('name', 'pey'), ('phone', '010202039904'), ('birth', '1112')])

a.items()는 딕셔너리의 key, value 쌍을 dict_items 객체로 돌려줍니다.

key로 value 얻기(get)

a = {'name': 'pey', 'phone': '010202039904', 'birth': '1112'}
a.get('name')
결과: 'pey'

a.get('phone')

결과: '010202039904'

get 함수를 사용하면 a.get(‘name’)처럼 key를 사용해서 value를 얻을 수 있습니다.

존재하지 않는 key로 value 얻기

a[‘nokey’]처럼 존재하지 않는 key로 value를 얻으려고 하면 오류가 발생합니다. 다음 예를 보세요.

a = {'name': 'pey', 'phone': '010202039904', 'birth': '1112'}
a['nokey']
# 결과: KeyError: 'nokey'

하지만 get 함수를 사용하면 이 오류가 발생하지 않습니다. 다음 예를 보세요.

a.get('nokey')
# 결과: None

딕셔너리 안에 찾으려는 key 값이 없을 경우 미리 정해둔 디폴트 값을 대신 가져오게 하고 싶을 때는 get(x, ‘디폴트 값’)을 사용하면 편리합니다.

a.get('foo', 'bar')
# 결과: 'bar'

key, value 쌍 모두 지우기 (clear)

a = {'name': 'pey', 'phone': '010202039904', 'birth': '1112'}
a.clear()
a
# 결과: {}

a.clear()는 딕셔너리 a 안의 모든 요소를 삭제합니다.

key로 value 얻기(in)

a = {'name': 'pey', 'phone': '010202039904', 'birth': '1112'}
'name' in a
# 결과: True

‘name’이라는 key 값이 딕셔너리 a 안에 있는지 조사할 수 있습니다. ‘name’ 문자열은 a라는 딕셔너리의 key 중 하나입니다. 따라서 True를 돌려줍니다. 반대로 ’email’은 a의 key 중 하나가 아니므로 False를 돌려줄 것입니다.

딕셔너리를 활용하면 데이터 처리 및 관리가 훨씬 간편해지며 그리고 파이썬 프로그래밍에서 자주 사용되는 자료구조 중 하나입니다. 따라서 딕셔너리에 대한 이해를 바탕으로 보다 다양하고 유연한 프로그래밍을 할 수 있을 것입니다. 여러분들의 즐거운 코딩이 되시길 기원합니다. 화이팅!

전강의 보기

Similar Posts