자료형 개요: 시퀀스, 매핑, 가변성 여부
파이썬에서는 데이터를 담는 구조로 리스트, 튜플, 집합, 딕셔너리 등 다양한 컨테이너를 제공합니다. 이 중 문자열, 리스트, 튜플은 시퀀스로 분류되며 인덱스를 통해 접근 가능하고 순서가 보장됩니다. 반면 딕셔너리는 키-값 쌍을 저장하는 매핑 자료형입니다.
가변성 측면에서 리스트, 집합, 딕셔너리는 내부 요소 변경이 가능하지만, 문자열과 튜플은 불변 객체입니다. 예를 들어 문자열을 수정하면 기존 객체가 아닌 새로운 객체가 생성되며 메모리 주소도 변경됩니다.
문자열 조작 기법
문자열은 대표적인 불변 시퀀스로, 슬라이싱, 검색, 변환 등을 지원합니다. 슬라이싱은 range()와 유사하게 시작 인덱스는 포함하고 끝 인덱스는 제외합니다. 스텝 값이 양수면 정방향, 음수면 역방향으로 처리됩니다.
# 기본 문자열
text = "hello world"
# 위치 탐색
text.find("o") # 첫 번째 'o'의 인덱스 반환 (4)
text.find("x") # 존재하지 않으면 -1 반환
text.index("w") # 찾지 못하면 ValueError 발생
"world" in text # 멤버십 확인 → True
# 슬라이싱 예시
text[0:5] # 'hello' (0부터 4까지)
text[::-1] # 'dlrow olleh' (역순)
text[-5:] # 'world' (뒤에서 5글자)
text[::2] # 'hlowrd' (두 칸씩 건너뛰기)
# 문자 변환 및 정제
text.upper() # 'HELLO WORLD'
text.lower() # 'hello world'
text.strip() # 양쪽 공백 제거
text.lstrip() # 왼쪽 공백 제거
text.rstrip() # 오른쪽 공백 제거
# 부분 조작
text.replace("world", "Python") # 'hello Python'
text.split() # 공백 기준 분할 → ['hello', 'world']
text.split("o") # 'o' 기준 분할 → ['hell', ' w', 'rld']
# 문자 유형 판별
"123".isdigit() # 숫자인지 확인 → True
"abc".isalpha() # 알파벳인지 확인 → True
"abc123".isalnum() # 영숫자 혼합인지 확인 → True
# 기타
len(text) # 길이 → 11
text.count("l") # 'l' 출현 횟수 → 3
리스트 조작 패턴
리스트는 가변적이고 순서가 있으며 중복 요소를 허용합니다. 삽입, 삭제, 정렬, 확장 등의 작업이 가능하며, 리스트 컴프리헨션을 통해 간결한 생성도 지원합니다.
# 초기 리스트
items = [3, 1, 4, 1, 5]
# 요소 추가
items.append(6) # 맨 뒤에 추가
items.insert(0, 0) # 인덱스 0에 삽입
# 요소 제거
items.pop() # 마지막 요소 제거
items.pop(2) # 인덱스 2 제거
items.remove(1) # 값이 1인 첫 번째 요소 제거
# 수정 및 재배치
items[0] = 99 # 특정 인덱스 값 변경
items.reverse() # 순서 반전
items.sort() # 오름차순 정렬
items.sort(reverse=True) # 내림차순 정렬
# 병합 및 확장
more_items = [7, 8]
items += more_items # += 연산자로 병합 (in-place)
items.extend(more_items) # extend()로 다른 iterable 추가
# 리스트 컴프리헨션
squares = [x**2 for x in range(1, 6)] # [1, 4, 9, 16, 25]
evens = [x for x in squares if x % 2 == 0] # 짝수 필터링
pairs = [(i, j) for i in range(1, 4) for j in range(1, 4)] # 곱집합 생성
튜플의 특징과 사용법
튜플은 불변 시퀀스로, 생성 후 내용 수정이 불가능합니다. 하지만 인덱스 접근, 반복, 슬라이싱은 가능하며 해싱 가능하여 딕셔너리 키로 사용할 수 있습니다.
# 튜플 정의
point = (10, 20, 30)
# 조회 및 정보 추출
point[0] # 첫 번째 요소 → 10
point.index(20) # 값 20의 인덱스 → 1
point.count(10) # 값 10의 출현 횟수 → 1
len(point) # 길이 → 3
# 반복
for val in point:
print(val)
# 병합 (새 튜플 생성)
new_point = point + (40, 50) # (10, 20, 30, 40, 50)
집합(Set) 조작
집합은 순서 없고 중복을 허용하지 않는 자료형입니다. 수학적 집합 연산(합집합, 교집합 등)을 자연스럽게 표현할 수 있습니다.
# 집합 생성
unique_nums = {1, 2, 3}
# 요소 추가
unique_nums.add(4) # 단일 요소 추가
unique_nums.update([5, 6, 7]) # 여러 요소 추가 (리스트, 튜플, 문자열 등 가능)
# 요소 제거
unique_nums.discard(10) # 존재하지 않아도 오류 없음
unique_nums.remove(3) # 존재하지 않으면 KeyError 발생
unique_nums.clear() # 전체 비우기
# 집합 연산 예시 (추가 설명)
a = {1, 2, 3}
b = {3, 4, 5}
a | b # 합집합 → {1, 2, 3, 4, 5}
a & b # 교집합 → {3}
a - b # 차집합 → {1, 2}
딕셔너리 활용 전략
딕셔너리는 키-값 쌍을 저장하며, 키는 불변 객체여야 하며 각 키는 유일해야 합니다.
# 딕셔너리 초기화
profile = {"name": "Alice", "age": 30}
# 값 수정 또는 추가
profile["age"] = 31 # 기존 키 업데이트
profile["city"] = "Seoul" # 새 키-값 추가
# 키-값 접근
profile.keys() # 모든 키 반환 → dict_keys(['name', 'age', 'city'])
profile.values() # 모든 값 반환
profile.items() # 모든 항목 반환 → [('name', 'Alice'), ('age', 31), ...]
# 반복 처리
for k in profile:
print(k) # 키 출력
for v in profile.values():
print(v) # 값 출력
for k, v in profile.items():
print(f"{k}: {v}") # 키와 값 동시 출력
# 안전한 값 조회
profile.get("email", "N/A") # 키 없을 시 기본값 반환 → "N/A"
# 여러 항목 추가 또는 병합
profile.update({"job": "Engineer", "lang": "Python"})
other_data = {"age": 32, "hobby": "coding"}
profile.update(other_data) # 동일 키는 덮어씀 → age=32
# 삭제
profile.pop("lang") # 특정 키 제거
profile.clear() # 전체 초기화