파이썬 기초 강좌: 10. 튜플 예제와 실습 (Python Basics – Tuple Examples and Exercises)

파이썬의 튜플(Tuple)은 데이터를 안전하게 관리하고, 코드의 가독성을 높이는 데 유용한 불변 데이터 구조입니다. 이 글에서는 튜플의 불변성, 비교, 할당, 딕셔너리와의 연계 등 다양한 활용 방법을 다룹니다. 실습 예제와 함께 튜플을 어떻게 효과적으로 사용할 수 있는지 배우고, 연습 문제를 통해 이해를 확장해보세요. 튜플을 활용하여 데이터 무결성을 유지하고, 파이썬 프로그래밍의 효율성과 가독성을 높이는 방법을 알아봅니다.

파이썬 기초 강좌 - 튜플 예제와 실습

1. 파이썬 기초 강좌 – 튜플은 불변 (Tuples are Immutable)

  • 튜플의 가장 큰 특징 중 하나는 불변성(immutability)입니다. 한 번 생성된 튜플은 수정할 수 없습니다. 이는 데이터의 무결성을 유지해야 할 때 유용합니다.
  • (실습) 튜플의 불변성
>>> t = (1, 2, 3)
>>> t[0] = 4
# 오류 발생: 튜플의 값은 변경할 수 없습니다.
  • 이 코드는 튜플의 값을 변경하려고 할 때 발생하는 오류를 보여줍니다.

2. 튜플 비교 (Comparing Tuples)

  • 튜플은 사전 순서에 따라 비교할 수 있습니다.
  • 첫 번째 요소부터 차례대로 비교하며, 동일한 요소는 다음 요소로 넘어가 비교합니다.
  • (실습) 튜플 비교
>>> t1 = (0, 1, 2)
>>> t2 = (0, 3, 4)
>>> print(t1 < t2)  # 출력: True
  • 이 코드는 두 튜플을 비교하여 첫 번째 튜플이 두 번째 튜플보다 작은지 확인합니다.

3. 튜플 할당 (Tuple Assignment)

  • 여러 변수에 동시에 값을 할당할 때 튜플을 사용할 수 있습니다.
  • 이를 튜플 언패킹(unpacking)이라고 하며, 코드의 가독성을 높입니다.
  • (실습) 튜플 할당
>>> (a, b, c) = (1, 2, 3)
>>> print(a)  # 출력: 1
>>> print(b)  # 출력: 2
>>> print(c)  # 출력: 3
  • 이 코드는 튜플을 사용하여 여러 변수에 동시에 값을 할당하는 방법을 보여줍니다.

4. 딕셔너리와 튜플 (Dictionaries and Tuples)

  • 튜플은 딕셔너리의 키로 사용할 수 있습니다.
  • 이는 리스트와는 다르게 튜플이 불변이기 때문입니다.
  • 예를 들어, 좌표를 키로 사용하여 값을 저장할 수 있습니다.
  • (실습) 딕셔너리와 튜플
>>> directory = {}
>>> directory[('Smith', 'John')] = 1234
>>> directory[('Doe', 'Jane')] = 5678
>>> print(directory)
  • 이 코드는 튜플을 딕셔너리의 키로 사용하여 값을 저장하는 방법을 보여줍니다.

5. 딕셔너리에서 다중 할당 (Multiple Assignment with Dictionaries)

  • 딕셔너리에서 다중 값을 할당받을 때 튜플을 사용할 수 있습니다.
  • 이는 주로 items 메서드와 함께 사용됩니다.
  • (실습) 딕셔너리에서 다중 할당
>>> d = {'a': 10, 'b': 1, 'c': 22}
>>> for (key, value) in d.items():
...     print(key, value)
  • 이 코드는 items 메서드를 사용하여 딕셔너리의 키-값 쌍을 반복하는 방법을 보여줍니다.

6. 튜플을 딕셔너리의 키로 사용 (Using Tuples as Keys in Dictionaries)

  • 튜플을 딕셔너리의 키로 사용하면 데이터 구조를 명확하게 만들 수 있습니다.
  • 이는 다차원 데이터를 저장할 때 특히 유용합니다.
  • (실습) 튜플을 딕셔너리의 키로 사용
>>> locations = {}
>>> locations[(35.6895, 139.6917)] = "Tokyo"
>>> locations[(37.7749, -122.4194)] = "San Francisco"
>>> print(locations)
  • 이 코드는 튜플을 사용하여 좌표를 딕셔너리의 키로 저장하는 방법을 보여줍니다.

Exercises

연습문제 1

  • 이전 프로그램을 수정하여 “From” 줄을 읽고 구문 분석하여 주소를 추출한 후, 각 사람으로부터 온 메시지 수를 세어 딕셔너리에 저장하세요.
  • 모든 데이터를 읽은 후, (count, email) 튜플의 리스트를 만들어 이를 내림차순으로 정렬한 후, 가장 많은 커밋을 한 사람을 출력하세요.

Sample 실행:

From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008
Enter a file name: mbox-short.txt
cwen@iupui.edu 5
Enter a file name: mbox.txt
zqian@umich.edu 195

정답 코드:

fname = input('Enter a file name: ')
try:
    fhand = open(fname)
except:
    print('File cannot be opened:', fname)
    exit()

email_count = dict()
for line in fhand:
    if line.startswith('From '):
        words = line.split()
        email = words[1]
        email_count[email] = email_count.get(email, 0) + 1

# (count, email) 튜플의 리스트를 만들어 내림차순으로 정렬
sorted_email_count = sorted([(count, email) for email, count in email_count.items()], reverse=True)

# 가장 많은 커밋을 한 사람을 출력
print(sorted_email_count[0][1], sorted_email_count[0][0])

연습문제 2

  • 이 프로그램은 각 메시지의 시간대를 세어 분포를 계산합니다.
  • “From” 줄에서 시간을 찾아서 문자열을 콜론으로 나눈 후 각 시간대의 개수를 셉니다.
  • 각 시간대를 정렬하여 한 줄에 하나 씩 출력하세요.

Sample 실행

python timeofday.py
Enter a file name: mbox-short.txt
04 3
06 1
07 1
09 2
10 3
11 6
14 1
15 2
16 4
17 2
18 1
19 1

정답 코드:

fname = input('Enter a file name: ')
try:
    fhand = open(fname)
except:
    print('File cannot be opened:', fname)
    exit()

hour_count = dict()
for line in fhand:
    if line.startswith('From '):
        words = line.split()
        time = words[5]
        hour = time.split(':')[0]
        hour_count[hour] = hour_count.get(hour, 0) + 1

# 시간대를 정렬하여 출력
for hour, count in sorted(hour_count.items()):
    print(hour, count)

연습문제 3

  • 파일을 읽고 알파벳 빈도에 따라 내림차순으로 문자를 출력하는 프로그램을 작성하세요.
  • 모든 입력을 소문자로 변환하고 a-z 문자만 세야 합니다.
  • 공백, 숫자, 구두점 등을 제외한 문자를 세지 마세요.
  • 다양한 언어의 텍스트 샘플을 사용하여 문자 빈도가 언어마다 어떻게 다른지 확인하세요.
  • 결과를 https://wikipedia.org/wiki/Letter_frequencies 의 표와 비교하세요.

정답 코드:

import string

fname = input('Enter a file name: ')
try:
    fhand = open(fname)
except:
    print('File cannot be opened:', fname)
    exit()

letter_count = dict()
for line in fhand:
    line = line.lower()
    for char in line:
        if char in string.ascii_lowercase:
            letter_count[char] = letter_count.get(char, 0) + 1

# 문자 빈도에 따라 내림차순으로 정렬하여 출력
sorted_letter_count = sorted(letter_count.items(), key=lambda item: item[1], reverse=True)
for letter, count in sorted_letter_count:
    print(letter, count)
  • sorted_letter_count = sorted(letter_count.items(), key=lambda item: item[1], reverse=True) 이 코드를 자세히 설명하겠습니다.
  • letter_count.items():
    • letter_count는 문자 빈도를 저장하는 딕셔너리입니다.
    • items() 메서드는 딕셔너리의 키-값 쌍을 dict_items 객체로 반환합니다.
    • 예: {'a': 5, 'b': 2}items()[('a', 5), ('b', 2)].
  • sorted(..., key=..., reverse=True):
    • sorted() 함수는 iterable 객체를 정렬하여 리스트로 반환합니다.
    • letter_count.items()는 정렬할 iterable 객체입니다.
    • key 매개변수는 정렬 기준을 정의하는 함수입니다.
    • reverse=True는 정렬 순서를 반대로 하여 내림차순으로 정렬합니다.
  • key=lambda item: item[1]:
    • lambda는 익명 함수를 생성하는 키워드입니다.
    • lambda item: item[1]는 입력값 item의 두 번째 요소(값)를 반환하는 함수입니다.
    • itemletter_count.items()에서 반환된 각 튜플((key, value))입니다.
    • 따라서, 이 lambda 함수는 딕셔너리 항목의 값을 기준으로 정렬하도록 합니다.

이 글에서는 파이썬의 튜플에 대해 다루었으며, 튜플의 불변성, 비교, 할당, 딕셔너리와의 연관성 등 다양한 주제를 설명했습니다. 또한, 실습 문제와 정답을 통해 직접 코드를 작성해 볼 수 있도록 구성했습니다. 튜플을 활용하여 파이썬 프로그래밍의 효율성과 가독성을 높이시기 바랍니다.

파이썬 기초 강좌: 9. 딕셔너리 예제와 실습 (Python Basics – Dictionary Examples and Exercises)

파이썬 기초 강좌: 11. 정규표현식 예제와 실습 (Python Basics – Regular expressions Examples and Exercises)

Leave a Comment