파이썬프로그래밍기초 9강 - 튜플, 문자열, 세트와 딕셔너리
여러 데이터를 목적에 맞게 저장하고 처리하는 파이썬 컬렉션 자료형을 학습한다. 튜플과 문자열의 순서·불변성, 세트의 중복 제거와 집합 연산, 딕셔너리의 키-값 대응 관계를 이해하고 팰린드롬, 금칙어 검사, 모스 부호 변환 프로그램에 적용한다.
제1장 튜플의 개념과 활용
1. 튜플이란
튜플(tuple)은 여러 값을 순서대로 저장하는 시퀀스 자료형이다. 일반적으로 소괄호 () 안에 원소를 쉼표로 구분하여 작성한다. 리스트처럼 인덱스로 원소에 접근하고 슬라이싱할 수 있지만, 생성된 뒤에는 원소를 추가·삭제·변경할 수 없는 불변 자료형이라는 차이가 있다.
numbers = (1, 4, 9, 16)
empty = ()
single = (10,)원소가 하나인 튜플은 값 뒤에 쉼표를 붙여야 한다. (10)은 단순히 정수 10을 괄호로 묶은 표현식이고, (10,)이 한 원소 튜플이다.
튜플은 순서가 있으므로 중복 원소를 저장할 수 있고 인덱싱이 가능하다. 반면 원소를 직접 바꿀 수 없기 때문에 프로그램 실행 중 유지되어야 할 값의 묶음을 표현하는 데 유용하다.
2. 튜플의 역할
튜플은 여러 변수에 값을 한 번에 할당하는 다중 할당에 활용된다. 좌변과 우변의 원소 수가 같으면 위치가 대응되어 값이 저장된다. 두 변수의 값을 교환할 때도 임시 변수 없이 튜플 할당을 이용할 수 있다.
x, y = (10, 20)
x, y = y, x첫 문장 뒤에는 x가 10, y가 20이다. 둘째 문장은 오른쪽 값을 튜플처럼 묶어 평가한 뒤 위치에 맞춰 다시 할당하므로 두 값이 교환된다.
함수에서 둘 이상의 결과를 한 번에 반환할 때도 튜플이 사용된다. 호출한 쪽은 반환된 튜플 전체를 한 변수로 받거나 원소 수에 맞춰 여러 변수로 분해할 수 있다.
3. 튜플의 연산자, 함수와 메소드
두 튜플은 +로 연결할 수 있고, 튜플과 정수는 *로 반복할 수 있다. in과 not in으로 원소의 포함 여부를 검사한다. len, max, min, sum 같은 내장 함수도 사용할 수 있다.
| 연산·함수·메소드 | 기능 |
|---|---|
t1 + t2 | 두 튜플을 연결한 새 튜플 생성 |
t * n | 튜플 원소를 n번 반복한 새 튜플 생성 |
x in t | x가 튜플에 포함되는지 검사 |
len(t) | 원소 개수 반환 |
max(t), min(t), sum(t) | 최댓값, 최솟값, 합계 반환 |
t.count(x) | x의 등장 횟수 반환 |
t.index(x) | x가 처음 등장하는 인덱스 반환 |
4. 정렬과 원소 추가
튜플은 불변 자료형이므로 원본의 원소 순서를 직접 바꾸는 sort 메소드를 제공하지 않는다. 대신 sorted 내장 함수를 사용하면 원소를 정렬한 새 리스트를 얻는다. 필요하면 그 결과를 다시 tuple 함수로 변환할 수 있다.
rad_tuple = (20, 10, 30)
sorted_list = sorted(rad_tuple)
sorted_tuple = tuple(sorted_list)튜플에는 append 메소드가 없으므로 기존 객체에 원소를 추가할 수 없다. 원소가 추가된 것처럼 만들려면 기존 튜플과 새 원소 튜플을 연결하여 새로운 튜플을 생성해야 한다.
rad_tuple = (10, 20, 30)
rad_tuple = rad_tuple + (40,)기존 튜플이 수정된 것이 아니라 네 원소를 가진 새 튜플이 만들어져 같은 변수에 다시 할당된다.
5. 튜플 슬라이싱과 컴프리헨션
튜플은 시퀀스이므로 튜플[시작:끝:간격] 형식으로 일부 구간을 잘라 낼 수 있다. 끝 인덱스의 원소는 결과에 포함되지 않는다. 슬라이싱 결과도 튜플이다.
컴프리헨션 표현식을 tuple 함수에 전달하면 조건과 변환 규칙에 따라 새로운 튜플을 만들 수 있다.
nums = (1, 2, 3, 4, 5)
part = nums[1:4]
squares = tuple(x * x for x in nums)part는 (2, 3, 4), squares는 (1, 4, 9, 16, 25)가 된다.
제2장 문자열과 시퀀스 처리
1. 문자열의 구성
문자열(string)은 문자들이 순서대로 나열된 시퀀스다. 따옴표로 생성하며 각 문자에는 0부터 시작하는 인덱스가 있다. 따라서 문자열도 인덱싱, 슬라이싱, 포함 여부 검사, 연결과 반복을 수행할 수 있다.
문자열은 튜플처럼 불변 자료형이다. 특정 인덱스의 문자를 직접 변경할 수 없으며, 메소드가 변환 결과를 만들 때는 새로운 문자열이 반환된다.
msg = "I do love python"
print(msg[0])
print(msg[5:9])
print(msg[::-1])첫 문자를 선택하고, 일부 구간을 슬라이싱하며, 간격을 -1로 지정하여 전체 문자열을 역순으로 만들 수 있다.
2. 주요 문자열 메소드
| 메소드 | 기능 |
|---|---|
split | 구분자를 기준으로 문자열을 나누어 리스트 반환 |
join | 여러 문자열 사이에 구분자를 넣어 하나의 문자열 생성 |
find | 부분 문자열이 처음 나타나는 위치 검색 |
replace | 특정 부분을 다른 문자열로 바꾼 새 문자열 반환 |
strip | 문자열 양 끝의 공백 또는 지정 문자 제거 |
startswith, endswith | 특정 문자열로 시작하거나 끝나는지 검사 |
isalpha | 문자열이 알파벳 문자로 구성되었는지 검사 |
isnumeric | 문자열이 수치 문자로 구성되었는지 검사 |
lower, upper | 영문자를 소문자 또는 대문자로 변환 |
3. 문자열과 리스트의 변환
list 함수에 문자열을 전달하면 각 문자가 리스트의 한 원소가 된다. 반대로 문자열의 join 메소드를 사용하면 문자열 리스트를 하나의 문자열로 결합할 수 있다.
hei_list = [1, 5, 14, 26, 31]
hei_csv = ",".join(str(x) for x in hei_list)
print(hei_csv)
chars = list("python")
word = "".join(chars)숫자 리스트를 join하려면 먼저 각 숫자를 문자열로 바꿔야 한다. join은 문자열 원소들을 연결하는 메소드이기 때문이다.
4. 팰린드롬 검사 프로그램
팰린드롬(palindrome)은 앞에서 읽은 결과와 뒤에서 읽은 결과가 같은 문자열이다. level은 팰린드롬이고 tomato는 그렇지 않다. 전체 문자열을 역순 슬라이싱한 결과와 원문을 비교하면 간단하게 검사할 수 있다.
sentence = input("문장을 입력하세요: ")
if sentence == sentence[::-1]:
print("결과: 팰린드롬입니다.")
else:
print("결과: 팰린드롬이 아닙니다.")제3장 세트와 집합 연산
1. 세트의 개념
세트(set)는 수학의 집합처럼 서로 다른 원소를 저장하는 컬렉션이다. 원소의 순서를 보장하지 않으며 같은 값은 한 번만 저장한다. 중복을 제거하거나 두 데이터 집합의 관계를 계산하는 데 적합하다.
원소가 있는 세트는 중괄호 {}로 만들 수 있지만 빈 세트는 set()으로 생성해야 한다. 빈 중괄호 {}는 빈 딕셔너리를 의미한다.
colors = {"red", "green", "blue"}
numbers = set([1, 2, 2, 3])
empty_set = set()numbers에는 중복 2가 하나만 남아 {1, 2, 3}이 저장된다.
2. 세트 관련 연산자
| 연산자 | 의미 |
|---|---|
x in s | 원소 x의 포함 여부 |
a | b | 합집합 |
a & b | 교집합 |
a - b | 차집합 |
a ^ b | 대칭차집합, 한쪽에만 속한 원소 |
a <= b | a가 b의 부분집합인지 검사 |
a >= b | a가 b의 상위집합인지 검사 |
len, max, min, sum 등의 내장 함수도 세트에 사용할 수 있다. 단 세트에는 순서가 없으므로 인덱싱과 슬라이싱은 사용할 수 없다.
3. 세트 주요 메소드
| 메소드 | 기능 |
|---|---|
issuperset | 다른 세트의 상위집합인지 검사 |
issubset | 다른 세트의 부분집합인지 검사 |
add | 원소 하나 추가 |
remove | 지정한 원소 삭제 |
intersection | 교집합 반환 |
union | 합집합 반환 |
difference | 차집합 반환 |
4. 세트 컴프리헨션
세트에는 순서가 없으므로 슬라이싱할 수 없지만 컴프리헨션으로 조건에 맞는 새 세트를 만들 수 있다. 중괄호 안에 변환식, 반복 대상, 선택 조건을 작성한다.
numbers = {1, 2, 3, 4, 5, 6}
even_squares = {x * x for x in numbers if x % 2 == 0}짝수만 선택하여 제곱하므로 결과에는 4, 16, 36이 들어간다.
5. 금칙어 포함 확인 프로그램
메일 제목에 금칙어가 포함되었는지 확인할 때 세트의 교집합을 활용할 수 있다. 제목을 소문자로 바꾸고 단어 단위로 나눈 뒤 세트로 변환하면 금칙어 세트와 공통된 단어가 있는지 검사할 수 있다.
ban_words = {"buy", "cheap", "discount", "free"}
title = input("제목을 입력하세요: ")
title_words = set(title.lower().split())
if ban_words & title_words:
print("결과: 스팸입니다.")
else:
print("결과: 스팸이 아닙니다.")Get it for FREE는 소문자로 변환했을 때 free가 금칙어 세트와 교차하므로 스팸으로 판정된다.
제4장 딕셔너리의 개념과 조작
1. 딕셔너리란
딕셔너리(dictionary)는 키(key)와 값(value)의 쌍을 저장하는 매핑 자료형이다. 리스트가 위치 번호로 원소를 찾는다면 딕셔너리는 키를 이용해 관련 값을 찾는다. 각 키는 딕셔너리 안에서 유일해야 하며 값은 중복될 수 있다.
딕셔너리는 중괄호 안에 키: 값 형식의 항목을 쉼표로 구분하여 만든다. 생성 후 항목을 추가·변경·삭제할 수 있는 가변 자료형이다.
basic_parts = {
"CPU": 450000,
"RAM": 120000,
"SSD": 180000
}2. 딕셔너리 관련 연산과 함수
in 연산자는 기본적으로 특정 키가 딕셔너리에 존재하는지를 검사한다. 대괄호에 키를 지정하면 대응하는 값을 읽거나 변경할 수 있다. 존재하지 않는 새 키에 값을 할당하면 항목이 추가된다.
print("CPU" in basic_parts)
print(basic_parts["CPU"])
basic_parts["RAM"] = 130000
basic_parts["GPU"] = 700000len은 키-값 쌍의 개수를 반환한다. max와 min을 딕셔너리 자체에 적용하면 기본적으로 키를 기준으로 결과를 구한다.
3. 딕셔너리 컴프리헨션
딕셔너리 컴프리헨션은 반복과 조건을 이용하여 키-값 쌍을 생성한다. 형식은 {키 표현식: 값 표현식 for 변수 in 반복가능객체 if 조건}이다.
parts = {"CPU": 450000, "RAM": 120000, "SSD": 180000}
expensive = {name: price for name, price in parts.items()
if price >= 180000}각 항목의 키와 값을 꺼내 가격 조건을 만족하는 부품만 새 딕셔너리에 저장한다.
문자열의 lower 메소드를 함께 사용하면 영문 키를 소문자로 통일한 새 딕셔너리를 만들 수도 있다.
4. 딕셔너리 주요 메소드
| 메소드 | 기능 |
|---|---|
keys | 모든 키를 볼 수 있는 객체 반환 |
values | 모든 값을 볼 수 있는 객체 반환 |
items | 키-값 쌍을 튜플 형태로 제공 |
get | 키에 대응하는 값을 안전하게 조회하고 기본값 지정 가능 |
update | 다른 키-값 쌍으로 항목 추가 또는 갱신 |
pop | 지정한 키의 값을 반환하면서 항목 삭제 |
clear | 모든 항목 삭제 |
대괄호 조회와 get의 차이
d[key]는 키가 없으면 오류가 발생하지만 d.get(key)는 키가 없을 때 None 또는 지정한 기본값을 반환할 수 있다.
제5장 모스 부호 변환 프로그램
1. 문자와 부호의 대응표
모스 부호 변환에는 영문자와 해당 모스 부호의 대응 관계가 필요하다. 딕셔너리는 문자를 키로, 모스 부호를 값으로 저장하므로 이러한 변환표를 표현하기에 적합하다.
morse = {
"a": ".-", "b": "-...", "c": "-.-.", "d": "-..",
"e": ".", "g": "--.", "i": "..", "m": "--",
"n": "-.", "o": "---", "s": "...", "t": "-",
"v": "...-"
}2. 변환 과정
사용자가 입력한 문장을 소문자로 바꾸고 한 문자씩 반복한다. 문자가 공백이면 단어 구분을 출력하고, 딕셔너리에 있는 영문자라면 그 문자를 키로 사용해 모스 부호를 찾는다. 변환한 부호들을 공백으로 연결하면 결과 문장이 된다.
sentence = input("문장을 영어로 입력하세요: ").lower()
result = []
for char in sentence:
if char == " ":
result.append("/")
elif char in morse:
result.append(morse[char])
print(" ".join(result))딕셔너리가 검색 규칙을 담당하고, 리스트가 변환된 부호를 순서대로 모으며, 문자열의 join 메소드가 최종 결과를 결합한다. 하나의 프로그램에서 여러 컬렉션 자료형이 각자의 장점을 살려 협력하는 예다.
자료형 선택의 기준
순서가 있고 변경하지 않을 값은 튜플, 문자 시퀀스는 문자열, 중복 없는 집합 관계는 세트, 키를 이용한 대응 관계는 딕셔너리가 적합하다. 저장하려는 데이터의 관계와 필요한 연산을 기준으로 자료형을 선택해야 한다.
핵심 개념 정리
① 튜플: 순서가 있는 불변 시퀀스로 다중 할당, 함수의 다중 반환, 인덱싱과 슬라이싱에 활용한다.
② 문자열: 문자로 구성된 불변 시퀀스이며 다양한 검색·분할·결합·변환 메소드를 제공한다.
③ 팰린드롬: 문자열과 [::-1]로 만든 역순 문자열을 비교하여 검사할 수 있다.
④ 세트: 순서와 중복이 없는 컬렉션으로 합집합, 교집합, 차집합, 대칭차집합을 지원한다.
⑤ 금칙어 검사: 입력 단어 세트와 금칙어 세트의 교집합이 비어 있지 않은지 확인한다.
⑥ 딕셔너리: 유일한 키와 값의 쌍을 저장하며 키를 통해 값을 빠르게 조회·변경한다.
⑦ 컴프리헨션: 반복과 조건을 한 표현식으로 조합하여 튜플·세트·딕셔너리를 생성할 수 있다.
최종 정리
컬렉션 자료형은 단순히 여러 값을 담는 그릇이 아니다. 순서, 변경 가능성, 중복 허용 여부, 키-값 대응이라는 데이터의 성격에 맞는 자료형을 선택하면 프로그램의 구조와 알고리즘이 명확해진다.
예상문제 20선
1. 튜플의 가장 중요한 특징은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
튜플은 순서 있는 시퀀스지만 불변 자료형이므로 생성된 원소를 직접 수정할 수 없다.
2. 원소가 하나인 튜플을 올바르게 만든 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
한 원소 튜플은 괄호만이 아니라 원소 뒤의 쉼표로 구분된다.
3. 튜플을 정렬한 새 리스트를 반환하는 함수는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
튜플은 원본을 정렬할 수 없으므로 sorted로 정렬된 새 리스트를 얻는다.
4. 튜플 t에서 값 3이 등장한 횟수를 구하는 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④count 메소드는 지정한 값이 시퀀스에 나타난 횟수를 반환한다.
5. 문자열 "level"[::-1]의 결과는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
간격 -1의 슬라이싱은 문자열을 역순으로 만든다. level은 팰린드롬이므로 결과가 원문과 같다.
6. 문자열을 구분자 기준으로 나누어 리스트를 반환하는 메소드는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②split은 문자열을 나누고, join은 여러 문자열을 결합한다.
7. 문자열 리스트 ["a", "b", "c"]를 "a-b-c"로 만드는 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③join은 호출 문자열을 구분자로 사용하여 문자열 원소들을 연결한다.
8. 문자열이 팰린드롬인지 확인하는 조건으로 적절한 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
원문과 역순 문자열이 같으면 앞뒤 어느 방향에서 읽어도 같은 팰린드롬이다.
9. 세트의 특징으로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
세트는 집합 자료형이므로 중복을 제거하며 원소 순서를 전제로 하지 않는다.
10. 빈 세트를 올바르게 만드는 표현은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②{}는 빈 딕셔너리이므로 빈 세트는 set()으로 생성한다.
11. 두 세트 a와 b의 교집합을 구하는 연산자는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③&는 두 세트에 공통으로 포함된 원소를 구하는 교집합 연산자다.
12. 세트에 인덱싱과 슬라이싱을 사용할 수 없는 주된 이유는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
인덱스와 슬라이싱은 위치 순서를 전제로 하지만 세트는 순서 없는 컬렉션이다.
13. 금칙어 세트와 제목 단어 세트에 공통 원소가 있는지 확인하는 데 적합한 연산은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
두 세트의 교집합이 비어 있지 않으면 제목에 금칙어가 하나 이상 포함된 것이다.
14. 딕셔너리에 대한 설명으로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
딕셔너리는 키를 이용해 대응하는 값을 찾는 가변 매핑 자료형이며 키는 중복될 수 없다.
15. d = {"CPU": 450000}에서 가격을 읽는 표현은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
딕셔너리는 대괄호 안에 키를 지정하여 그 키에 대응하는 값을 조회한다.
16. 딕셔너리의 모든 키-값 쌍을 제공하는 메소드는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④items는 각 항목을 키와 값으로 구성된 튜플 형태로 제공한다.
17. 존재하지 않는 키를 오류 없이 조회하고 기본값을 지정할 수 있는 메소드는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①get은 키가 없을 때 오류 대신 None이나 사용자가 지정한 기본값을 반환한다.
18. 딕셔너리에서 항목을 추가하는 방법으로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
존재하지 않는 키에 값을 할당하면 새 키-값 항목이 딕셔너리에 추가된다.
19. 모스 부호 변환표를 표현하기에 딕셔너리가 적합한 이유는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
문자를 키로 사용하면 해당 문자에 대응하는 모스 부호를 값으로 즉시 조회할 수 있다.
20. 자료형과 용도의 연결로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
세트는 중복 없는 원소와 집합 연산에, 딕셔너리는 키를 통한 값의 저장과 조회에 적합하다.
댓글
댓글 쓰기