본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
Ch 7. 프로그래밍에도 데이터 타입이 있어요.
파이썬 데이터 타입 완벽 가이드: 리스트, 튜플, 집합, 딕셔너리
파이썬에서 데이터를 다루는 것은 마치 서로 다른 성격의 상자들을 사용하는 것과 같습니다. 각각의 데이터 타입은 고유한 특성과 용도를 가지고 있으며, 상황에 따라 적절한 것을 선택해야 합니다. 이 글에서는 파이썬의 주요 컬렉션 데이터 타입인 리스트, 튜플, 집합, 딕셔너리를 차근차근 살펴보겠습니다.
1. 리스트(List): 유연한 순서형 컨테이너
리스트는 파이썬에서 가장 자주 사용되는 데이터 타입 중 하나입니다. 마치 여러 개의 물건을 순서대로 넣을 수 있는 상자와 같다고 생각하면 됩니다.
리스트의 특징
- 순서가 있음: 요소들이 특정 순서로 저장됩니다
- 변경 가능: 생성 후에도 요소를 추가, 삭제, 수정할 수 있습니다
- 중복 허용: 같은 값을 여러 번 저장할 수 있습니다
- 다양한 타입: 서로 다른 데이터 타입을 함께 저장할 수 있습니다
리스트 기본 사용법
# 리스트 생성 - 대괄호 사용
fruits = ['사과', '바나나', '오렌지']
numbers = [1, 2, 3, 4, 5]
mixed = ['문자열', 42, True, 3.14] # 서로 다른 타입도 함께 저장 가능
# 빈 리스트 생성
empty_list = []
another_empty = list()
print(fruits) # ['사과', '바나나', '오렌지']
print(len(numbers)) # 5 - 리스트의 길이
리스트 인덱싱과 슬라이싱
fruits = ['사과', '바나나', '오렌지', '포도', '딸기']
# 인덱싱 - 0부터 시작
print(fruits[0]) # '사과' - 첫 번째 요소
print(fruits[-1]) # '딸기' - 마지막 요소 (음수 인덱스 사용)
# 슬라이싱 - 부분 추출
print(fruits[1:3]) # ['바나나', '오렌지'] - 1번째부터 2번째까지
print(fruits[:2]) # ['사과', '바나나'] - 처음부터 1번째까지
print(fruits[2:]) # ['오렌지', '포도', '딸기'] - 2번째부터 끝까지
print(fruits[::2]) # ['사과', '오렌지', '딸기'] - 2칸씩 건너뛰기
리스트 메서드 활용
# 요소 추가
fruits = ['사과', '바나나']
fruits.append('오렌지') # 끝에 하나 추가
fruits.extend(['포도', '딸기']) # 여러 개 추가
fruits.insert(1, '키위') # 특정 위치에 삽입
print(fruits) # ['사과', '키위', '바나나', '오렌지', '포도', '딸기']
# 요소 제거
fruits.remove('키위') # 값으로 제거 (첫 번째 발견된 것만)
popped = fruits.pop() # 마지막 요소 제거하고 반환
del fruits[0] # 인덱스로 제거
# 정렬과 뒤집기
numbers = [3, 1, 4, 1, 5, 9, 2, 6]
numbers.sort() # 원본 리스트를 정렬
print(numbers) # [1, 1, 2, 3, 4, 5, 6, 9]
numbers.reverse() # 순서 뒤집기
print(numbers) # [9, 6, 5, 4, 3, 2, 1, 1]
리스트 컴프리헨션 - 고급 기법
# 기본 for 루프
squares = []
for i in range(1, 6):
squares.append(i ** 2)
# 리스트 컴프리헨션으로 동일한 결과
squares = [i ** 2 for i in range(1, 6)]
print(squares) # [1, 4, 9, 16, 25]
# 조건부 리스트 컴프리헨션
even_squares = [i ** 2 for i in range(1, 11) if i % 2 == 0]
print(even_squares) # [4, 16, 36, 64, 100]
2. 튜플(Tuple): 불변의 순서형 컨테이너
튜플은 리스트와 매우 유사하지만, 한 번 생성되면 변경할 수 없는 특성을 가집니다. 마치 밀봉된 상자와 같다고 생각할 수 있습니다.
튜플의 특징
- 순서가 있음: 요소들이 순서대로 저장됩니다
- 변경 불가능: 생성 후에는 수정할 수 없습니다
- 중복 허용: 같은 값을 여러 번 저장할 수 있습니다
- 해시 가능: 딕셔너리의 키로 사용할 수 있습니다
튜플 기본 사용법
# 튜플 생성 - 소괄호 사용 (생략 가능)
coordinates = (3, 5)
colors = ('빨강', '파랑', '초록')
mixed_tuple = ('문자열', 42, True)
# 소괄호 없이도 생성 가능
point = 10, 20
single_item = 42, # 단일 요소 튜플은 쉼표 필요
# 빈 튜플
empty_tuple = ()
another_empty = tuple()
print(coordinates) # (3, 5)
print(type(single_item)) # <class 'tuple'>
튜플 언패킹 - 매우 유용한 기능
# 좌표 튜플 언패킹
point = (10, 20)
x, y = point # 튜플의 값들을 각각의 변수에 할당
print(f"x: {x}, y: {y}") # x: 10, y: 20
# 여러 값을 한 번에 할당
person = ('김철수', 25, '서울')
name, age, city = person
print(f"{name}님은 {age}세이고 {city}에 살고 있습니다.")
# 변수 값 교환 - 매우 간단!
a, b = 10, 20
a, b = b, a # 튜플을 이용한 값 교환
print(f"a: {a}, b: {b}") # a: 20, b: 10
튜플의 활용 예시
# 함수에서 여러 값 반환
def get_name_age():
return "이영희", 30
name, age = get_name_age() # 튜플 언패킹으로 받기
# 좌표 계산 함수
def distance_from_origin(point):
"""원점에서의 거리 계산"""
x, y = point # 튜플 언패킹
return (x**2 + y**2) ** 0.5
coords = (3, 4)
dist = distance_from_origin(coords)
print(f"거리: {dist}") # 거리: 5.0
# 데이터베이스 레코드 표현
student_records = [
('김철수', 20, '컴퓨터공학'),
('이영희', 21, '수학'),
('박민수', 19, '물리학')
]
for name, age, major in student_records:
print(f"{name} - {age}세, {major} 전공")
3. 집합(Set): 중복 없는 유일한 요소들의 모음
집합은 수학의 집합 개념과 동일합니다. 중복된 요소가 없고, 순서가 없는 데이터의 모음입니다.
집합의 특징
- 순서 없음: 요소들의 순서가 정의되지 않습니다
- 중복 불허: 같은 값을 두 번 저장할 수 없습니다
- 변경 가능: 요소를 추가하거나 제거할 수 있습니다
- 빠른 검색: 멤버십 테스트가 매우 빠릅니다
집합 기본 사용법
# 집합 생성 - 중괄호 사용
fruits = {'사과', '바나나', '오렌지'}
numbers = {1, 2, 3, 4, 5}
# 리스트나 문자열에서 집합 생성
letters = set('hello') # {'h', 'e', 'l', 'o'} - 중복 제거됨
unique_numbers = set([1, 2, 2, 3, 3, 3]) # {1, 2, 3}
# 빈 집합 생성 (주의: {}는 딕셔너리!)
empty_set = set()
print(fruits) # {'사과', '바나나', '오렌지'} - 순서는 보장되지 않음
print(len(numbers)) # 5
집합 연산 - 수학적 집합 연산
# 두 집합 정의
set_a = {1, 2, 3, 4, 5}
set_b = {4, 5, 6, 7, 8}
# 합집합 (Union)
union_result = set_a | set_b # 또는 set_a.union(set_b)
print(f"합집합: {union_result}") # {1, 2, 3, 4, 5, 6, 7, 8}
# 교집합 (Intersection)
intersection_result = set_a & set_b # 또는 set_a.intersection(set_b)
print(f"교집합: {intersection_result}") # {4, 5}
# 차집합 (Difference)
difference_result = set_a - set_b # 또는 set_a.difference(set_b)
print(f"차집합: {difference_result}") # {1, 2, 3}
# 대칭 차집합 (Symmetric Difference)
symmetric_diff = set_a ^ set_b # 또는 set_a.symmetric_difference(set_b)
print(f"대칭 차집합: {symmetric_diff}") # {1, 2, 3, 6, 7, 8}
집합 메서드와 활용
# 집합 수정
colors = {'빨강', '파랑', '초록'}
colors.add('노랑') # 요소 추가
colors.update(['보라', '주황']) # 여러 요소 추가
colors.remove('파랑') # 요소 제거 (없으면 에러)
colors.discard('검정') # 요소 제거 (없어도 에러 없음)
print(colors) # {'빨강', '초록', '노랑', '보라', '주황'}
# 멤버십 테스트 - 매우 빠름
print('빨강' in colors) # True
print('파랑' in colors) # False
# 실용적인 예: 중복 제거
email_list = ['user1@example.com', 'user2@example.com', 'user1@example.com', 'user3@example.com']
unique_emails = list(set(email_list)) # 중복 제거
print(unique_emails)
4. 딕셔너리(Dictionary): 키-값 쌍의 매핑
딕셔너리는 키와 값을 연결하는 데이터 구조입니다. 마치 사전에서 단어(키)를 찾아 뜻(값)을 확인하는 것과 같습니다.
딕셔너리의 특징
- 키-값 쌍: 각 요소는 키와 값으로 구성됩니다
- 순서 유지: Python 3.7+에서는 삽입 순서가 유지됩니다
- 키는 고유: 같은 키를 두 번 사용할 수 없습니다
- 빠른 검색: 키를 통한 값 접근이 매우 빠릅니다
딕셔너리 기본 사용법
# 딕셔너리 생성 - 중괄호와 콜론 사용
student = {
'name': '김철수',
'age': 20,
'major': '컴퓨터공학',
'grades': [85, 90, 78, 92]
}
# 다양한 생성 방법
colors = dict(red='빨강', blue='파랑', green='초록')
empty_dict = {}
another_empty = dict()
print(student['name']) # '김철수'
print(student['grades']) # [85, 90, 78, 92]
딕셔너리 조작
# 값 추가 및 수정
student = {'name': '김철수', 'age': 20}
student['major'] = '컴퓨터공학' # 새 키-값 쌍 추가
student['age'] = 21 # 기존 값 수정
student.update({'gpa': 3.8, 'year': 2}) # 여러 항목 동시 추가
print(student)
# {'name': '김철수', 'age': 21, 'major': '컴퓨터공학', 'gpa': 3.8, 'year': 2}
# 안전한 값 접근
print(student.get('name')) # '김철수'
print(student.get('phone', '정보 없음')) # '정보 없음' - 기본값 반환
# 키 존재 확인
print('age' in student) # True
print('phone' in student) # False
딕셔너리 반복과 메서드
student = {
'name': '김철수',
'age': 20,
'major': '컴퓨터공학',
'gpa': 3.8
}
# 다양한 반복 방법
print("=== 키만 반복 ===")
for key in student: # 또는 student.keys()
print(key)
print("\n=== 값만 반복 ===")
for value in student.values():
print(value)
print("\n=== 키-값 쌍 반복 ===")
for key, value in student.items():
print(f"{key}: {value}")
# 딕셔너리 컴프리헨션
squares = {x: x**2 for x in range(1, 6)}
print(squares) # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
# 조건부 딕셔너리 컴프리헨션
even_squares = {x: x**2 for x in range(1, 11) if x % 2 == 0}
print(even_squares) # {2: 4, 4: 16, 6: 36, 8: 64, 10: 100}
실용적인 딕셔너리 활용
# 데이터 그룹화
students = [
{'name': '김철수', 'grade': 'A', 'subject': '수학'},
{'name': '이영희', 'grade': 'B', 'subject': '수학'},
{'name': '박민수', 'grade': 'A', 'subject': '과학'},
{'name': '정소영', 'grade': 'A', 'subject': '수학'},
]
# 성적별 그룹화
grade_groups = {}
for student in students:
grade = student['grade']
if grade not in grade_groups:
grade_groups[grade] = []
grade_groups[grade].append(student['name'])
print(grade_groups)
# {'A': ['김철수', '박민수', '정소영'], 'B': ['이영희']}
# 카운팅
text = "hello world"
char_count = {}
for char in text:
char_count[char] = char_count.get(char, 0) + 1
print(char_count)
# {'h': 1, 'e': 1, 'l': 3, 'o': 2, ' ': 1, 'w': 1, 'r': 1, 'd': 1}
언제 어떤 데이터 타입을 사용해야 할까?
각 데이터 타입은 서로 다른 상황에서 최적의 성능과 편의성을 제공합니다.
리스트를 사용하는 경우
- 순서가 중요한 데이터를 저장할 때
- 데이터를 자주 추가, 삭제, 수정해야 할 때
- 같은 값이 여러 번 나타날 수 있을 때
- 인덱스로 빠른 접근이 필요할 때
# 예시: 쇼핑 목록, 할 일 목록, 점수 기록
shopping_list = ['우유', '빵', '달걀', '사과']
todo_list = ['숙제하기', '운동하기', '책읽기']
test_scores = [85, 92, 78, 85, 90] # 중복 점수 허용
튜플을 사용하는 경우
- 데이터가 변경되지 않아야 할 때
- 함수에서 여러 값을 반환할 때
- 딕셔너리의 키로 사용할 때
- 좌표, 날짜 등 구조적 데이터를 표현할 때
# 예시: 좌표, 날짜, 설정값
coordinates = (10, 20)
birth_date = (1990, 5, 15)
rgb_color = (255, 128, 0)
집합을 사용하는 경우
- 중복을 제거해야 할 때
- 빠른 멤버십 테스트가 필요할 때
- 수학적 집합 연산을 수행할 때
- 고유한 값들만 관리하고 싶을 때
# 예시: 고유 사용자, 권한 관리, 태그
unique_visitors = {'user1', 'user2', 'user3'}
permissions = {'read', 'write', 'execute'}
tags = {'python', 'programming', 'tutorial'}
딕셔너리를 사용하는 경우
- 키-값 관계를 표현할 때
- 빠른 검색이 필요할 때
- 구조화된 데이터를 저장할 때
- 매핑 관계를 나타낼 때
# 예시: 사용자 정보, 설정, 카운팅
user_profile = {'name': '김철수', 'age': 25, 'email': 'kim@example.com'}
app_settings = {'theme': 'dark', 'language': 'ko', 'notifications': True}
word_count = {'python': 5, 'programming': 3, 'tutorial': 2}
성능 비교와 고려사항
import time
# 대용량 데이터에서의 성능 비교 예시
data = list(range(100000))
data_set = set(data)
# 리스트에서 요소 검색 (선형 시간)
start = time.time()
99999 in data
list_search_time = time.time() - start
# 집합에서 요소 검색 (상수 시간)
start = time.time()
99999 in data_set
set_search_time = time.time() - start
print(f"리스트 검색 시간: {list_search_time:.6f}초")
print(f"집합 검색 시간: {set_search_time:.6f}초")
print(f"집합이 약 {list_search_time/set_search_time:.0f}배 빠름")
오늘의 실습
https://fastcampus.info/4n8ztzq
(~6/20) 50일의 기적 AI 환급반💫 | 패스트캠퍼스
초간단 미션! 하루 20분 공부하고 수강료 전액 환급에 AI 스킬 장착까지!
fastcampus.co.kr
'개발공부 > python' 카테고리의 다른 글
패스트캠퍼스 환급챌린지 10일차 : 한 번에 끝내는 컴퓨터 공학 & 인공지능 복수전공 초격차 패키지 강의 후기 (0) | 2025.07.10 |
---|---|
패스트캠퍼스 환급챌린지 8일차 : 한 번에 끝내는 컴퓨터 공학 & 인공지능 복수전공 초격차 패키지 강의 후기 (0) | 2025.07.08 |
패스트캠퍼스 환급챌린지 4일차 : 한 번에 끝내는 컴퓨터 공학 & 인공지능 복수전공 초격차 패키지 강의 후기 (0) | 2025.07.04 |
패스트캠퍼스 환급챌린지 3일차 : 한 번에 끝내는 컴퓨터 공학 & 인공지능 복수전공 초격차 패키지 강의 후기 (0) | 2025.07.03 |
패스트캠퍼스 환급챌린지 2일차 : 한 번에 끝내는 컴퓨터 공학 & 인공지능 복수전공 초격차 패키지 강의 후기 (0) | 2025.07.02 |