파이썬 문자열을 한 글자씩 읽는 방법
파이썬에서 문자열을 한 글자씩 읽는 두 가지 방법
파이썬에서 문자열을 다룰 때, 각각의 글자를 하나씩 읽어야 하는 상황이 자주 있습니다. 예를 들어, 입력된 단어의 각 글자를 확인하여 조건에 맞는 문자만 처리하거나, 글자별로 통계를 내는 프로그램을 만들 수도 있죠. 이 글에서는 문자열을 한 글자씩 읽는 대표적인 두 방법인 인덱스를 이용한 접근과 for문을 이용한 순회를 비교하여 설명합니다.
이번 내용을 이해하려면 파이썬의 기본 변수, 문자열 자료형, for 반복문과 range() 함수에 대해 아주 기초적인 개념만 알면 충분합니다. 아직 익숙하지 않더라도 예제와 함께 따라하며 배워보기 좋습니다.
인덱스를 이용해 문자열의 각 글자 읽기
문자열은 각 글자가 0부터 시작하는 번호(인덱스)를 가지고 있어, 원하는 위치의 글자를 바로 꺼낼 수 있습니다. 인덱스를 이용하면 반복문과 range() 함수를 함께 사용해 모든 글자를 순서대로 읽을 수 있습니다.
예제: "apple"의 각 글자를 인덱스로 접근해 출력하기
word = "apple"
for i in range(len(word)):
print(word[i])실행 결과
a
p
p
l
e
여기서 range(len(word))는 0부터 4까지(문자 개수만큼) 반복하고, word[i]는 해당 인덱스의 글자를 꺼냅니다. 문자열의 길이가 바뀌어도 모든 글자를 정확히 읽을 수 있는 방법입니다.
for문으로 문자열을 직접 순회하기
파이썬에서는 문자열 자체를 반복문에 넣으면 자동으로 한 글자씩 꺼내 사용할 수 있습니다. 이 방식은 코드가 더 간단하고 읽기 쉽기 때문에 초보자가 자주 쓰는 방법입니다.
예제: for문으로 "apple"의 각 글자 출력하기
word = "apple"
for ch in word:
print(ch)실행 결과
a
p
p
l
e
여기서 ch는 반복할 때마다 word의 각 글자가 차례로 들어가는 변수입니다. 인덱스를 신경 쓸 필요 없이 바로 문자를 처리할 수 있어 실수를 줄일 수 있습니다.
같은 데이터를 두 방법으로 읽은 결과 비교
이번에는 동일한 문자열을 인덱스 방식과 for문 방식으로 각각 읽고, 두 방식의 실제 동작 차이와 선택 기준을 살펴보겠습니다.
동일한 시작 데이터 사용
"hello"라는 문자열을 두 방식으로 읽는 예제입니다.
word = "hello"
print("인덱스 방식:")
for i in range(len(word)):
print(word[i])
print("for문 방식:")
for ch in word:
print(ch)실행 결과
인덱스 방식:
h
e
l
l
o
for문 방식:
h
e
l
l
o
실행 결과는 두 방식 모두 글자를 순서대로 출력해 결과는 동일합니다. 하지만 인덱스가 필요한 상황과 필요하지 않은 상황에서 코드의 복잡도가 달라집니다.
값의 위치와 차이가 생기는 경우
인덱스 번호를 꼭 같이 써야 할 경우도 있습니다. 예를 들어, 각 글자와 함께 그 위치(인덱스)도 함께 출력하려면 인덱스 방식을 쓰거나 enumerate() 함수를 활용해야 합니다.
예제: 인덱스와 글자를 함께 출력하기
word = "python"
for i in range(len(word)):
print(i, word[i])실행 결과
0 p
1 y
2 t
3 h
4 o
5 n
for문만 사용하면 인덱스를 직접 알 수 없으므로 아래처럼 enumerate()를 사용해야 합니다.
word = "python"
for i, ch in enumerate(word):
print(i, ch)실행 결과
0 p
1 y
2 t
3 h
4 o
5 n
초보자가 자주 하는 실수와 오류, 경계 동작
문자열 인덱스 방식은 특히 인덱스 범위를 벗어난 접근에서 오류가 자주 발생합니다.
잘못된 예: 인덱스가 범위를 넘어가는 경우
word = "dog"
print(word[3]) # 존재하지 않는 위치
이 코드는 IndexError가 발생합니다. 문자열 "dog"의 인덱스는 0, 1, 2까지만 있습니다. 이런 실수는 for문 방식에서는 발생하지 않습니다.
정상 코드로 고치려면 인덱스가 len(word)-1 이내인지 꼭 확인해야 하며, for문 순회 방식이면 이런 걱정이 없습니다.
인덱스를 실수로 잘못 계산한 경우
길이가 5인 문자열의 for문 범위를 5까지로 잘못 설정하면 아래와 같이 오류가 납니다.
word = "apple"
for i in range(6):
print(word[i])
위 코드는 마지막 반복에서 word[5]에 접근하여 IndexError가 납니다. 항상 range(len(word))를 사용해야 안전합니다.
실제 사용 예제: 각 글자별로 모음인지 자음인지 확인하기
각 글자를 하나씩 읽어 모음(a, e, i, o, u)이면 "vowel", 아니면 "consonant"라고 표시하는 예제입니다.
word = "banana"
vowels = "aeiou"
for ch in word:
if ch in vowels:
print(f"{ch}: vowel")
else:
print(f"{ch}: consonant")실행 결과
b: consonant
a: vowel
n: consonant
a: vowel
n: consonant
a: vowel
이처럼 글자 단위 처리에는 for문 순회 방식이 훨씬 간단합니다. 인덱스 방식으로도 구현할 수 있지만 코드가 복잡해집니다.
두 방식의 선택 기준과 비교표
- 인덱스 방식은 글자의 위치(인덱스) 정보가 꼭 필요할 때 사용합니다.
- for문 순회는 단순히 한 글자씩만 처리하면 되는 경우 가장 쉽고 안전한 방법입니다.
- 인덱스 방식은 인덱스 계산 실수, 범위 초과 오류(
IndexError)가 더 잘 발생합니다. - for문 순회 방식은 문자열이 비어 있어도 오류가 나지 않아 안전합니다.
| 구분 | 인덱스 방식 | for문 순회 |
|---|---|---|
| 코드 길이 | 조금 더 김 | 짧고 단순함 |
| 인덱스 정보 활용 | 쉽게 가능 | enumerate() 필요 |
| 오류 위험 | 인덱스 실수로 오류 발생 가능 | 거의 없음 |
| 추천 상황 | 위치별 처리 필요 | 글자별 단순 처리 |
정리와 연습 문제
핵심 정리: 문자열을 한 글자씩 읽는 가장 쉽고 안전한 방법은 for문 직접 순회입니다. 인덱스가 꼭 필요할 때만 인덱스 방식을 쓰고, 그렇지 않으면 실수를 줄이기 위해 for문 순회를 우선하는 것이 좋습니다.
- 아래 코드가 출력하는 값을 써 보세요.
word = "quiz" for ch in word: print(ch)실행 결과
q u i z - 문자열 "coding"의 각 글자 옆에 인덱스를 붙여 출력하는 코드를 작성해 보세요. (
for문 순회또는enumerate()활용) - 사용자가 입력한 단어를 한 글자씩 거꾸로 출력하려면 어떻게 해야 할까요? (힌트: 인덱스 역순 반복 또는 슬라이싱 활용)
이제 파이썬에서 문자열을 효과적으로 다루는 방법을 연습해 보세요!