파이썬 강좌 – 튜플, 세트, 딕셔너리 – 변수를 다양한 방법으로 묶기

  1. 프롤로그
  2. 개발 첫걸음
    1. 컴퓨터 구성요소 - 컴퓨터는 어떤 걸 할 수 있나?
    2. 개발과 관련된 용어
    3. 파이썬의 선택 - 왜 파이썬인가?
    4. 파이썬 설치 - Hello World 출력하기
    5. Visual Studio Code 의 편리한 기능
    6. REPL과 콘솔 창 - 파이썬 동작시키기
  3. 파이썬 기초
    1. 기초 입출력 - 소통하기
    2. 변수와 대입 - 기억하기
    3. 연산자 - 계산하기
    4. 조건문 - 분기를 만들기
    5. 반복문 - 비슷한 작업을 반복하기
    6. 변수와 리스트 - 비슷한 변수들을 묶기
    7. for, range - 리스트의 항목을 다루기
    8. 파이선 기초 꿀팁
      1. 함수와 메소드의 호출 - 편리한 기능 이용하기
      2. 모듈 설치와 사용 - 유용한 기능 끌어다 쓰기
      3. 문자열 - 텍스트 다루기
  4. 파이썬 중급
    1. 정규표현식 - 문자열을 검색하고 치환하기(작성중)
    2. 함수를 직접 만들기 - 자주 쓰는 기능을 묶기
    3. 딕셔너리, 튜플, 세트 - 변수를 다양한 방법으로 묶기
    4. 클래스와 객체 - 변수를 사람으로 진화시키기
    5. 상속 - 클래스를 확장하기
    6. 파이썬 중급 꿀팁
      1. 코드를 작성하는 사람의 의도(작성중)
      2. 정체성과 동질성 - 객체의 성질(작성중)
      3. 명령문, 표현식 - 문법을 이루는 것들 (작성중)
      4. 슬라이싱 - 리스트를 갖고 놀기
  5. 파이썬 고급
    1. 예외와 에러 - 예상치 못한 상황에 대응하기
    2. 특별 메소드와 연산자 - 파이썬의 내부 작동방식 이해하기
    3. 다양한 함수 인수 - 유연한 함수 만들기
    4. 시퀀스와 반복자 - 반복과 순회를 자유자재로 다루기
    5. 변수의 범위 - 이름 검색의 범위
  6. 파이썬 심화
    1. 제너레이터와 코루틴 -
    2. async와 await
    3. 데코레이터 - 함수의 기능을 강화하기
    4. 객체로서의 클래스 - 클래스를 동적으로 정의하기
  7. 파이썬 프로젝트 실습
    1. 원카드 게임 만들기 (1)
    2. 원카드 게임 만들기 (2)
  8. 실전 (파이썬 외적인 것들)
    1. 유니코드 - 컴퓨터에서 문자를 표기하는 방법
    2. html, css, 인터넷 - 자동화 첫 걸음 내딛기
    3. 네트워크 - 인터넷으로 통신하는 방법
    4. 문서 - 문맥을 읽어보기

지금까지 변수를 묶는 변수는 list 외에는 배우지 않았습니다. 리스트처럼 변수를 묶는 변수를 아울러 컨테이너라고 합니다. 컨테이너는 작동 방식과 특성에 따라 여러 갈래로 나뉠 수 있으며, 오늘 배울 튜플, 세트, 딕셔너리는 파이썬에서 기본적으로 제공하는 리스트와는 또 다른 컨테이너입니다. 이들의 특성을 알아봅시다.

튜플 (tuple)

list에는 여러가지 변수들을 언제든지 원하는 때에 추가하고 삭제할 수 있습니다. 또한 인덱스와 []를 통해서 리스트 내부의 값을 즉시 추출해낼 수 있으며, for 반복문에 써서 항목을 쉽게 순회할 수 있습니다. 리스트는 언제든지 추가와 삭제가 가능하여 편리하지만, 이러한 특성은 특정한 상황에는 되려 단점이 될 수 있습니다. 값이 한 번 정해지면 영원히 값이 바뀌지 않아야 하는 상황에서는 오히려 튜플을 쓰기 더 적합합니다. 값이 바뀌지 않는 특성을 불변성이라고 하며, 이것이 필요한 구체적인 예는 추가 예정입니다.

튜플을 새롭게 만드려면 소괄호 ()와 쉼표 ,로 구분되는 항목들을 써 넣으면 됩니다. 예를 들어 tup = (1, 2, '하이')라고 작성할 수 있습니다. 빈 튜플은 ()으로 작성할 수 있고, 단 하나의 항목만 있는 튜플은 ('호',)와 같이 쉼표를 섞어줘야 하나의 튜플로 인식할 수 있습니다.

예시를 보면서 진행하겠습니다.


tup = (1, 2, '하이')
print(tup) ##a_1##
print(type(tup)) ##a_2##
print(tup[2]) ##a_3##
print(len(tup)) ##a_4##

tup += ('호',) ##a_5##
print(tup)

# tup[2] = '헬로우' ##a_6##

for val in tup: ##a_7##
    print(val)

people = [('철수', 24), ('민수', 23), ('윤희', 15)] ##a_8##
for name, age in people:
    print(name, '의 나이는', age, '살 입니다.')
(1, 2, '하이')
<class 'tuple'>
하이
3
(1, 2, '하이', '호')
1
2
하이
호
철수 의 나이는 24 살 입니다.
민수 의 나이는 23 살 입니다.
윤희 의 나이는 15 살 입니다.

a_1(1.) 그대로 출력

튜플은 print를 통해 그대로 출력할 수 있습니다.

a_2(2.) 타입

튜플의 타입은 tuple 입니다.

a_3(3.) 항목 접근

리스트와 마찬가지로 []를 이용해 항목에 접근할 수 있습니다.

a_4(4.) 길이

리스트와 마찬가지로 len 함수를 통해 길이를 구할 수 있습니다.

a_5(5.) 튜플 덧붙이기

튜플은 리스트처럼 append 등 항목을 변형하는 메소드가 없습니다. 만약 튜플끼리 + 한다면 합쳐진 새로운 튜플이 생성됩니다. 튜플의 항목 하나하나가 문자열 str의 글자 하나하나 라고 상상하시면 더 와닿을 수도 있겠습니다.

a_6(6.) 수정은 불가

튜플의 내부 값은 수정할 수 없습니다. 그래서 []를 통해 접근한 뒤 항목을 수정하려고 하면 아래와 같은 에러가 발생합니다.

Traceback (most recent call last):
  File "c:/Users/tooth/Desktop/test2.py", line 10, in <module>
    tup[2] = '헬로우'
TypeError: 'tuple' object does not support item assignment

a_7(7.) for

튜플은 리스트와 마찬가지로 for 루프를 통해 각 항목에 접근할 수 있습니다.

a_8(8.) 리스트와 함께 쓰기

for에서 변수를 새롭게 정의하는 칸에 쉼표로 항목을 구분해주어 튜플의 항목을 즉시 꺼내올 수 있습니다.


세트 (set)

세트는 쉽게 말하여 집합입니다. 즉 항목 간 순서가 존재하지 않고, 항목의 중복을 허용하지 않습니다. 중복된 항목을 추가하려 하면 가볍게 무시됩니다. 순서가 없으므로 []를 통한 접근이 불가능하며, for 를 이용해 모든 항목을 1회 순회할 수는 있지만 순서는 무작위입니다. 세트는 영어로 set 입니다. 세트는 중괄호 {}와 쉼표 ,를 통해 항목을 구분하여 새로운 세트를 생성해낼 수 있습니다.

ss = {1, '하이', 3, 2}

for item in ss: ##b_1##
    print(item)

ss.add('하이') ##b_2##
print(ss)

ss.add('호빵') ##b_3##
print(ss)
2
1
하이
3
{2, 1, '하이', 3}
{1, 2, '하이', 3, '호빵'}

b_1(1.) for

리스트나 튜플과 마찬가지로 for를 통해 항목을 순회할 수 있지만 그 순서는 보장되어 있지 않습니다.

b_2(2.) 중복된 항목 추가

add 메소드를 통해 항목을 추가할 수 있지만, 만약 항목이 중복되어 있다면 아무 일도 일어나지 않습니다.

b_3(3.) 중복되지 않은 항목 추가

중복되지 않는 새로운 항목을 추가하려고 하면 의도대로 잘 작동합니다.


딕셔너리 (dictionary)

딕셔너리의 모든 항목은 키(key)와 값(value)이 한 쌍으로 존재합니다. 항목 내 접근과 수정은 키(key)를 통해 이루어지며 실제 값은 별도로 있습니다. 마치 우리가 변수의 이름과 값을 구분하는 것처럼 딕셔너리도 마찬가지입니다. 키는 중복을 허용하지 않습니다. 세트와 마찬가지로 항목간 순서는 무의미합니다.

새로운 딕셔너리를 만드려면 중괄호 {}와 쉼표 ,를 이용하고, 키와 값을 구분하기 위해 콜론 :을 둡니다.

person = {'name':'철수', 'age':24, 'height':173, 1234:5678}

print(person['name']) ##c_1##

person['age'] = 34 ##c_2##
print(person)

person['hometown'] = 'Busan' ##c_3##
print(person)

for key, value in person.items(): ##c_4##
    print('키:', key, '값:', value)
철수
{'name': '철수', 'age': 34, 'height': 173, 1234: 5678}
{'name': '철수', 'age': 34, 'height': 173, 1234: 5678, 'hometown': 'Busan'}
키: name 값: 철수
키: age 값: 34
키: height 값: 173
키: 1234 값: 5678
키: hometown 값: Busan

c_1(1.) 항목 접근

[]에 키를 넣어줌으로써 항목에 접근할 수 있습니다.

c_2(2.) 항목 수정

[]로 접근한 것을 대입하면 항목이 수정됩니다.

c_3(3.) 항목 추가

존재하지 않는 키에 대한 대입 시도는 새로운 항목을 만들어냅니다.

c_4(4.) for

딕셔너리는 그 자체로 for에 넣을 수 없습니다. 하지만 items 메소드를 호출하게 되면 키-값 쌍 튜플이 여러 개 담긴 리스트를 반환하여 for를 사용할 수 있게 됩니다. 위 코드에서 person.items()[('name', '철수'), ('age', 34), ('height', 173), (1234, 5678), ('hometown', 'Busan')]와 아주 유사한 결과를 내놓습니다.


프로그래밍 문제

  1. 외부에서 데이터를 읽어와야 하는 상황이며, getData 함수가 그 역할을 한다고 가정한다. 이 함수의 반환값은 딕셔너리이다. 우리는 데이터의 10이라는 키 값을 이용해 데이터를 얻고 싶지만 이 딕셔너리에 10이라는 키 값이 있는지 없는지 알 수 없다. 즉 data[10]의 결과가 제대로 나올 수도 있고 키를 찾을 수 없어 에러가 발생할 수도 있다. 이러한 상황에서 절대 에러가 나오지 않도록 프로그램을 설계하고자 한다. 키가 존재한다면 데이터를 그대로 가지고 오고, 키가 존재하지 않는다면 0으로 간주하도록 다음 코드를 적절히 수정하라.

    import random
    def getData():
        dic = {}
        for i in range(10):
            dic[random.randint(1, 20)] = i
        return dic
    
    data = getData()
    # print(data[10]) # 에러가 일어날 수도 있고 일어나지 않을 수도 있다.
    
    • 힌트1. 파이썬 딕셔너리 메소드 중 get 을 검색해보라.

    • 힌트2. 파이썬 딕셔너리 메소드 중 keys 를 검색해보고, 그와 함께 in 연산자를 고려해보라.


프로그래밍 문제 정답

  1. 코드입니다.

    import random
    def getData():
        dic = {}
        for i in range(10):
            dic[random.randint(1, 20)] = i
        return dic
    
    data = getData()
    
    print(data.get(10, 0)) # get을 이용
    
    if 10 in data.keys(): # keys를 이용
        print(data[10])
    else:
        print(0)
    

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다

Scroll to top