파이썬의 튜플(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
의 두 번째 요소(값)를 반환하는 함수입니다.item
은letter_count.items()
에서 반환된 각 튜플((key, value)
)입니다.- 따라서, 이
lambda
함수는 딕셔너리 항목의 값을 기준으로 정렬하도록 합니다.
이 글에서는 파이썬의 튜플에 대해 다루었으며, 튜플의 불변성, 비교, 할당, 딕셔너리와의 연관성 등 다양한 주제를 설명했습니다. 또한, 실습 문제와 정답을 통해 직접 코드를 작성해 볼 수 있도록 구성했습니다. 튜플을 활용하여 파이썬 프로그래밍의 효율성과 가독성을 높이시기 바랍니다.
파이썬 기초 강좌: 9. 딕셔너리 예제와 실습 (Python Basics – Dictionary Examples and Exercises)
파이썬 기초 강좌: 11. 정규표현식 예제와 실습 (Python Basics – Regular expressions Examples and Exercises)