Python String
프로그래밍에서 문자열은 정말 자주 마주치는 데이터다.
값을 입력받고, 출력하고, 저장하고, 비교하는 등
거의 모든 단계에서 문자열이 빠지지 않는다.
하지만 한 가지 어려움이 있다.
문자열은 눈에 보이는 그대로 처리되지 않는다는 것이다.
공백, 줄바꿈 문자, 백슬래시처럼 눈에 잘 띄지 않는 요소들이
예상치 못한 결과를 만들어내기도 한다.
그래서 파이썬에서 문자열을 더 똑똑하게 다루는 방법 —
특히 input()
, format()
그리고 실무에서 자주 쓰이는 문자열 관련 함수들까지
실무에서도 바로 활용할 수 있도록 정리했다.
1. input 과 format 함수
예시 :
menu = input('주문할 메뉴를 입력하세요 ')
price = int(input('한 잔 가격이 얼마인가요? '))
count = int(input('몇 잔 주문하세요? '))
total = price * count
msg = '{0:s} {1:d}잔 가격은 총 {2:,}입니다.'
print(msg.format(menu, count, total))
# 주문할 메뉴를 입력하세요 라떼
# 한 잔 가격이 얼마인가요? 5000
# 몇 잔 주문하세요? 3
# 라떼 3잔 가격은 총 15,000입니다.
1) 주요 포인트
• input()
: 사용자의 입력을 문자열로 받아온다.
• int()
: 입력값이 숫자일 경우, 연산을 위해 정수로 변환한다.
• format()
: 문자열 안의 {} 자리에 값을 넣는다.
:s
, :d
, :,
등의 형식 지정자도 함께 사용해 본다.
2) 형식 지정자 정리
형식 | 의미 | 예시 |
---|---|---|
:s |
문자열 (string) | "{:s}".format("지희") ➡️ "지희" |
:d |
정수 (decimal) | "{:d}".format(25) ➡️ "25" |
:, |
천 단위 쉼표 | "{:,}".format(1000000) ➡️ "1,000,000" |
2. 딕셔너리와 리스트로 데이터 정리하기
리스트와 딕셔너리를 함께 활용하면 데이터를 구조화하고,
문자열 포맷팅을 통해 출력 형식을 자유롭게 조정할 수 있다.
실무에서 리포트 출력, 콘솔 로그 정리, CSV 저장 전 미리보기 등에 많이 사용된다.
예시:
items = [
{"name": "아메리카노", "price": 3000, "qty": 2},
{"name": "카페라떼", "price": 4000, "qty": 1},
{"name": "샌드위치", "price": 5500, "qty": 3}
]
header_str = '{0:10}{1:10}{2:10}{3:10}'
print(header_str.format('상품명', '가격', '수량', '총액'))
print('-' * 45)
data_str = '{0:10} {1:10,}원 {2:10}잔 {3:10,}원'
for item in items:
item_name = item['name']
item_price = item['price']
item_qty = item['qty']
total_price = item_price * item_qty
print(data_str.format(item_name, item_price, item_qty, total_price))
# 상품명 가격 수량 총액
# ---------------------------------------------
# 아메리카노 3,000원 2잔 6,000원
# 카페라떼 4,000원 1잔 4,000원
# 샌드위치 5,500원 3잔 16,500원
1) 출력 포맷 설명
포맷 | 설명 |
---|---|
{0:10} |
10칸 너비로 문자열 정렬 |
{1:10,} |
가격에 천 단위 쉼표 추가, 10칸 폭 |
{2:10} |
수량을 10칸에 정렬 |
{3:10,} |
총액도 쉼표 추가하여 10칸 정렬 |
3. 불변성(Immutable)
문자열은 불변(immutable) 자료형이기 때문에, 문자열의 일부만 바꾸는 것이 불가능하다.
예시 :
str_1 = 'hello'
str_1[0] = 'H' # ❌ TypeError 발생
1) 해결 방법: 문자열 ➡️ 리스트 ➡️ 다시 문자열
str_2 = list(str_1) # ['h', 'e', 'l', 'l', 'o']
str_2[0] = 'H' # ['H', 'e', 'l', 'l', 'o']
result = ''.join(str_2) # 'Hello'
2) 주요 포인트
•list()
로 문자열을 리스트로 변환하면 요소 수정이 가능해진다.
•join()
함수로 다시 문자열로 합치면 해결 된다.
4. 중첩 리스트(nested list)
리스트 안에 리스트가 들어있는 구조를 중첩 리스트라고 한다.
예시:
a = ['aaa', 'bbb', 'ccc']
b = [1, 2, 'aaa', 'bbb']
c = [a, b] # 중첩 리스트
c[0] # ['aaa', 'bbb', 'ccc']
c[1] # [1, 2, 'aaa', 'bbb']
c[1][2] # 'aaa'
c[1][1:-1] # [2, 'aaa']
슬라이싱도 가능하며, 복잡한 데이터를 다룰 때 매우 유용하다.
5. method vs function
구분 | 설명 |
---|---|
메서드 | 객체에 소속된 함수. 예: list.count() |
함수 | 독립적으로 동작하는 함수. 예: len() |
예시 :
num_list = [1, 3, 5, 7, 9]
print(num_list.count(10)) # 메서드
print(len(num_list)) # 함수
dir(num_list)
#0
#5
#['__add__',
# '__class__',
# '__class_getitem__',
# '__contains__',
# '__delattr__',
# '__delitem__',
# '__dir__', ...
dir(객체)를 사용하면 객체에 포함된 메서드를 확인할 수 있다.
6. f-string (문자열 포맷팅 최신 문법)
파이썬 3.6부터 도입된 f-string
은 문자열을 더 간단하고 직관적으로 포맷팅할 수 있는 방법이다.
기존의 format()
방식보다 훨씬 가독성이 좋고, 실무에서도 가장 많이 쓰인다.
1) 기본 문법
예시 1 :
name = '지희'
age = 25
print(f'안녕하세요, 저는 {name}이고 나이는 {age}살입니다.')
#안녕하세요, 저는 지희이고 나이는 25살입니다.
예시 2 : 입력값으로 간식 삭제하기
msg = f'빼고 싶은 간식이 있다면 번호를 입력하세요 (0~{len(snack_box)-1}): '
user_input = input(msg)
if user_input.strip() == '':
print("입력이 비어있습니다. 아무것도 삭제하지 않아요.")
else:
try:
snack_num = int(user_input)
if 0 <= snack_num < len(snack_box):
del snack_box[snack_num]
print("간식을 삭제했어요:", snack_box)
else:
print("유효한 번호를 입력해주세요.")
except ValueError:
print("숫자를 입력해주세요.")
2) 주요 포인트
• f'문자열 {변수}'
형식으로 변수를 문자열에 바로 넣을 수 있다.
• 중괄호 {}
안에는 계산식도 들어갈 수 있어요. 예: {len(snack_box)-1}
• 문자열 안에 변수나 표현식 결과를 바로 삽입할 수 있어서 가독성이 좋다.
7. format() VS f-string
방식 | 예시 코드 | 결과 |
---|---|---|
format() |
"이름: {}, 나이: {}".format(name, age) |
"이름: 지희, 나이: 25" |
f-string |
f"이름: {name}, 나이: {age}" |
"이름: 지희, 나이: 25" |
결론: 파이썬 3.6 이상에서는 f-string이 훨씬 간단하고 직관적이다.
8. 실무에서 자주 쓰이는 함수 정리
함수 | 설명 | 예시 |
---|---|---|
lower() | 모두 소문자로 변환 | “Python”.lower() ➡️ “python” |
upper() | 모두 대문자로 변환 | “python”.upper() ➡️ “PYTHON” |
capitalize() | 첫 글자만 대문자 | “hello”.capitalize() ➡️ “Hello” |
title() | 각 단어의 첫 글자 대문자 | “hello world”.title() ➡️ “Hello World” |
strip() | 앞뒤 공백 제거 | ” hello “.strip() ➡️ “hello” |
lstrip() | 왼쪽 공백 제거 | ” hello”.lstrip() |
rstrip() | 오른쪽 공백 제거 | “hello “.rstrip() |
replace(old, new) | 문자열 바꾸기 | “hello”.replace(“l”, “x”) ➡️ “hexxo” |
split() | 문자열 나누기 (기본: 공백) | “a b c”.split() ➡️ [‘a’, ‘b’, ‘c’] |
join(list) | 리스트를 문자열로 결합 | ” “.join([‘a’, ‘b’]) ➡️ “a b” |
find(sub) | 처음 등장하는 위치 (없으면 -1) | “apple”.find(“p”) ➡️ 1 |
index(sub) | 처음 등장하는 위치 (없으면 오류) | “apple”.index(“p”) ➡️ 1 |
count(sub) | 부분 문자열 개수 | “banana”.count(“a”) ➡️ 3 |
startswith(sub) | 해당 문자열로 시작? | “python”.startswith(“py”) ➡️ True |
endswith(sub) | 해당 문자열로 끝남? | “python”.endswith(“on”) ➡️ True |
isalnum() | 영문자+숫자인가? | “abc123”.isalnum() ➡️ True |
isalpha() | 영문자만인가? | “abc”.isalpha() ➡️ True |
isdigit() | 숫자만인가? | “123”.isdigit() ➡️ True |
isspace() | 공백문자만 있는가? | ” \t\n”.isspace() ➡️ True |
9. 실무에서 자주 쓰이는 메서드 정리
메서드 | 사용 예시 | 설명 |
---|---|---|
append(x) | lst.append(4) | 맨 뒤에 x 추가 |
insert(i, x) | lst.insert(1, “a”) | i 위치에 x 삽입 |
extend(iter) | lst.extend([4, 5]) | 리스트에 여러 값 추가 |
remove(x) | lst.remove(“a”) | x와 일치하는 첫 항목 삭제 |
pop() | lst.pop() | 마지막 항목 제거하고 반환 |
pop(i) | lst.pop(0) | i번째 항목 제거하고 반환 |
clear() | lst.clear() | 리스트 전체 비우기 |
index(x) | lst.index(“a”) | x의 위치(인덱스) 반환 |
count(x) | lst.count(“a”) | x의 개수 세기 |
sort() | lst.sort() | 오름차순 정렬 (원본 변경) |
sort(reverse=True) | lst.sort(reverse=True) | 내림차순 정렬 |
reverse() | lst.reverse() | 항목 순서 뒤집기 |
copy() | lst2 = lst.copy() | 리스트 복사 (원본 변경) |
deepcopy() | lst2 = lst.deepcopy() | 리스트 깊은 복사 (원본 동일) |
오늘을 마치며
오늘은 파이썬에서 문자열을 다루는 다양한 방법을 배웠다.
사용자 입력부터 문자열 포맷팅, 리스트와 딕셔너리로 데이터를 구조화하는 방법,
그리고 format()
과 f-string
의 차이까지 —
실무에서도 바로 활용할 수 있는 실습 위주로 정리했다.
코드를 더 예쁘고 직관적으로 만들 수 있는 좋은 도구를 알게 되었고,
f-string
처럼 지금은 작고 사소한 코드 한 줄처럼 보여도
이런 경험들이 쌓이면,
“읽기 쉬운 코드, 유지보수하기 좋은 코드”를
짤 수 있는 분석가가 될 수 있을 거라 생각한다.