본문 바로가기

개발공부/python

패스트캠퍼스 환급챌린지 7일차 : 한 번에 끝내는 컴퓨터 공학 & 인공지능 복수전공 초격차 패키지 강의 후기

반응형

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.

 

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

 

반응형