여러 값을 한 번에 관리하기
변수를 하나씩 만들면 불편합니다.
# ❌ 이렇게 하면 안 됨
student1 = "철수"
student2 = "영희"
student3 = "민준"
# ✅ 리스트로 묶기
students = ["철수", "영희", "민준"]
리스트 (List)
순서가 있고, 중복 허용, 변경 가능한 자료구조입니다.
fruits = ["사과", "바나나", "체리", "사과"] # 중복 허용
# 인덱싱
print(fruits[0]) # 사과 (첫 번째)
print(fruits[-1]) # 사과 (마지막)
# 슬라이싱
print(fruits[1:3]) # ['바나나', '체리']
print(fruits[:2]) # ['사과', '바나나']
print(fruits[::2]) # ['사과', '체리'] (2칸씩)
리스트 조작
items = ["A", "B", "C"]
# 추가
items.append("D") # 끝에 추가: ['A', 'B', 'C', 'D']
items.insert(1, "X") # 인덱스 1에 삽입: ['A', 'X', 'B', 'C', 'D']
# 삭제
items.remove("X") # 값으로 삭제
deleted = items.pop() # 마지막 요소 꺼내기: 'D'
deleted = items.pop(0) # 인덱스로 꺼내기: 'A'
# 검색
print("B" in items) # True
print(items.index("C")) # 1
# 정렬
nums = [3, 1, 4, 1, 5, 9]
nums.sort() # 원본 수정: [1, 1, 3, 4, 5, 9]
sorted_nums = sorted(nums, reverse=True) # 새 리스트: [9, 5, 4, 3, 1, 1]
# 길이
print(len(items)) # 2
리스트 컴프리헨션
반복문으로 리스트를 만드는 파이썬다운 방법입니다.
# 일반 반복문
squares = []
for n in range(1, 6):
squares.append(n ** 2)
# [1, 4, 9, 16, 25]
# 리스트 컴프리헨션 (한 줄로)
squares = [n ** 2 for n in range(1, 6)]
# [1, 4, 9, 16, 25]
# 조건 추가
evens = [n for n in range(20) if n % 2 == 0]
# [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
# 문자열 변환
names = ["alice", "bob", "charlie"]
upper_names = [name.upper() for name in names]
# ['ALICE', 'BOB', 'CHARLIE']
딕셔너리 (Dictionary)
키(key)와 값(value)의 쌍으로 저장합니다. 순서 있음 (Python 3.7+), 키는 중복 불가.
person = {
"name": "김철수",
"age": 25,
"job": "개발자",
"skills": ["Python", "JavaScript"]
}
# 값 접근
print(person["name"]) # 김철수
print(person.get("email", "없음")) # 없음 (키가 없을 때 기본값)
# 추가/수정
person["email"] = "kim@example.com"
person["age"] = 26
# 삭제
del person["job"]
removed = person.pop("email")
# 키 존재 확인
print("name" in person) # True
딕셔너리 순회
profile = {"name": "철수", "age": 25, "city": "서울"}
# 키만
for key in profile:
print(key)
# 값만
for value in profile.values():
print(value)
# 키-값 쌍
for key, value in profile.items():
print(f"{key}: {value}")
딕셔너리 컴프리헨션
# 제곱수 딕셔너리
squares = {n: n**2 for n in range(1, 6)}
# {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
# 필터링
scores = {"철수": 85, "영희": 92, "민준": 67, "지수": 78}
passed = {name: score for name, score in scores.items() if score >= 70}
# {'철수': 85, '영희': 92, '지수': 78}
튜플 (Tuple)
리스트와 비슷하지만 **변경 불가(immutable)**합니다.
point = (10, 20) # 좌표
rgb = (255, 128, 0) # 색상
x, y = point # 언패킹
print(f"x={x}, y={y}") # x=10, y=20
# 함수에서 여러 값 반환할 때 자동으로 튜플
def get_range(nums):
return min(nums), max(nums)
lo, hi = get_range([3, 1, 4, 1, 5]) # (1, 5) 언패킹
집합 (Set)
순서 없음, 중복 제거, 수학적 집합 연산.
a = {1, 2, 3, 4, 5}
b = {3, 4, 5, 6, 7}
print(a & b) # {3, 4, 5} 교집합
print(a | b) # {1,2,3,4,5,6,7} 합집합
print(a - b) # {1, 2} 차집합
# 중복 제거
data = [1, 2, 2, 3, 3, 3, 4]
unique = list(set(data)) # [1, 2, 3, 4]
실전 패턴: JSON 데이터 처리
API 응답은 대부분 딕셔너리/리스트 구조입니다.
import json
# API 응답 예시
response_text = '''
{
"users": [
{"id": 1, "name": "철수", "active": true},
{"id": 2, "name": "영희", "active": false},
{"id": 3, "name": "민준", "active": true}
],
"total": 3
}
'''
data = json.loads(response_text)
# 활성 사용자만 추출
active_users = [
user["name"]
for user in data["users"]
if user["active"]
]
print(active_users) # ['철수', '민준']
print(f"전체: {data['total']}명, 활성: {len(active_users)}명")
자료구조 비교
| 자료구조 | 문법 | 순서 | 중복 | 변경 | 주요 용도 |
|---|---|---|---|---|---|
| list | [1, 2, 3] | ✅ | ✅ | ✅ | 순서 있는 목록 |
| dict | {"a": 1} | ✅ | 키 불가 | ✅ | 키-값 매핑 |
| tuple | (1, 2, 3) | ✅ | ✅ | ❌ | 불변 데이터 |
| set | {1, 2, 3} | ❌ | ❌ | ✅ | 중복 제거 |
정리
| 개념 | 핵심 |
|---|---|
| 리스트 | 순서 있는 가변 컬렉션, .append(), .remove() |
| 리스트 컴프리헨션 | [expr for x in iter if cond] |
| 딕셔너리 | 키-값 쌍, .get(), .items() |
| 딕셔너리 컴프리헨션 | {k: v for k, v in iter} |
| 튜플 | 불변 리스트, 언패킹 가능 |
| 집합 | 중복 제거, 집합 연산 |
다음 편에서는 파일 입출력 — 파일을 읽고 쓰고, CSV·JSON 데이터를 처리하는 방법을 배웁니다.