본문 바로가기
Python

Python 기초 5장 - 컬렉션(Collections) 완벽 가이드

by daddydontsleep 2024. 11. 28.
728x90
728x90

사진: UnsplashKeith Tanner

Python 기초 5장 - 컬렉션(Collections) 완벽 가이드

안녕하세요! 오늘은 Python의 핵심 데이터 구조인 컬렉션(Collections)에 대해 자세히 알아보겠습니다. Python의 컬렉션은 여러 데이터를 효율적으로 저장하고 관리할 수 있게 해주는 데이터 구조입니다.

목차

  1. 리스트(List)
  2. 튜플(Tuple)
  3. 세트(Set)
  4. 딕셔너리(Dictionary)
  5. 컬렉션의 비교

1. 리스트(List)

1.1 리스트의 개념

리스트는 Python에서 가장 많이 사용되는 컬렉션으로, 순서가 있는 데이터의 집합입니다. 대괄호 []를 사용하여 생성하며, 서로 다른 타입의 데이터도 함께 저장할 수 있습니다.

# 리스트 생성
numbers = [1, 2, 3, 4, 5]
mixed_list = [1, "Hello", 3.14, True]

1.2 리스트의 주요 메서드와 연산

# 리스트 조작하기
fruits = ['apple', 'banana', 'orange']

# 추가
fruits.append('grape')  # ['apple', 'banana', 'orange', 'grape']
fruits.insert(1, 'kiwi')  # ['apple', 'kiwi', 'banana', 'orange', 'grape']

# 삭제
fruits.remove('banana')  # 값으로 삭제
del fruits[0]  # 인덱스로 삭제
popped = fruits.pop()  # 마지막 요소 제거 및 반환

# 정렬
fruits.sort()  # 오름차순 정렬
fruits.sort(reverse=True)  # 내림차순 정렬

# 리스트 슬라이싱
numbers = [0, 1, 2, 3, 4, 5]
print(numbers[1:4])  # [1, 2, 3]
print(numbers[:3])   # [0, 1, 2]
print(numbers[2:])   # [2, 3, 4, 5]

2. 튜플(Tuple)

2.1 튜플의 개념

튜플은 리스트와 비슷하지만 불변(immutable) 객체입니다. 한 번 생성된 후에는 내용을 수정할 수 없습니다. 소괄호 ()를 사용하여 생성합니다.

# 튜플 생성
coordinates = (3, 4)
single_element = (1,)  # 요소가 하나인 경우 콤마 필수

2.2 튜플의 활용

# 튜플 활용
point = (3, 4)
x, y = point  # 언패킹

# 튜플의 장점
def get_coordinates():
    return (10, 20)  # 여러 값 반환 시 유용

# 읽기 전용 데이터로 활용
DAYS = ('월', '화', '수', '목', '금', '토', '일')

3. 세트(Set)

3.1 세트의 개념

세트는 중복을 허용하지 않는 순서 없는 컬렉션입니다. 중괄호 {}를 사용하여 생성합니다.

# 세트 생성
unique_numbers = {1, 2, 3, 3, 4, 4, 5}  # {1, 2, 3, 4, 5}
empty_set = set()  # 빈 세트 생성

3.2 세트의 연산

# 집합 연산
A = {1, 2, 3, 4}
B = {3, 4, 5, 6}

# 합집합
print(A | B)  # {1, 2, 3, 4, 5, 6}
print(A.union(B))

# 교집합
print(A & B)  # {3, 4}
print(A.intersection(B))

# 차집합
print(A - B)  # {1, 2}
print(A.difference(B))

# 대칭차집합
print(A ^ B)  # {1, 2, 5, 6}
print(A.symmetric_difference(B))

4. 딕셔너리(Dictionary)

4.1 딕셔너리의 개념

딕셔너리는 키-값 쌍을 저장하는 컬렉션입니다. 중괄호 {}와 콜론 :을 사용하여 키와 값을 구분합니다.

# 딕셔너리 생성
student = {
    'name': '홍길동',
    'age': 20,
    'grades': [90, 85, 88]
}

4.2 딕셔너리의 주요 메서드와 활용

# 딕셔너리 조작
person = {'name': '김철수', 'age': 25}

# 추가/수정
person['job'] = '개발자'
person.update({'age': 26, 'city': '서울'})

# 삭제
del person['age']
job = person.pop('job')

# 키/값 추출
keys = person.keys()
values = person.values()
items = person.items()

# 안전한 값 접근
age = person.get('age', 0)  # 키가 없을 경우 기본값 반환

5. 컬렉션의 비교

각 컬렉션 타입의 특징을 비교해보겠습니다:

특징 리스트 튜플 세트 딕셔너리
순서 O O X X
중복허용 O O X 키:X, 값:O
수정가능 O X O O
인덱싱 O O X 키로 접근
용도 일반적인 데이터 시퀀스 불변 데이터 중복 제거, 집합 연산 키-값 매핑

컬렉션 선택 가이드

  • 리스트: 순서가 있는 데이터를 자주 수정해야 할 때
  • 튜플: 데이터가 변경되지 않아야 할 때, 함수의 반환값으로
  • 세트: 중복을 제거하거나 집합 연산이 필요할 때
  • 딕셔너리: 키를 통해 값을 빠르게 찾아야 할 때

마무리

Python의 컬렉션은 각각의 특징과 장단점이 있습니다. 상황에 맞는 적절한 컬렉션을 선택하여 사용하면 더 효율적인 프로그래밍이 가능합니다. 실제 프로젝트에서는 이러한 컬렉션들을 조합하여 사용하는 경우가 많으니, 각각의 특징을 잘 이해하고 활용하시기 바랍니다.

연습문제

  1. 다음 리스트에서 중복을 제거하고 정렬하세요:

    numbers = [1, 3, 2, 2, 5, 4, 3, 1, 5]
  2. 학생들의 성적을 관리하는 딕셔너리를 만들고, 평균을 계산하세요.

  3. 두 개의 세트를 만들고 교집합, 합집합, 차집합을 구하세요.

연습문제 답안

  1. 리스트의 중복 제거 및 정렬
    numbers = [1, 3, 2, 2, 5, 4, 3, 1, 5]
    

방법 1: set을 활용한 중복 제거 후 정렬

result1 = sorted(list(set(numbers)))
print(result1) # [1, 2, 3, 4, 5]

방법 2: 리스트 컴프리헨션을 활용한 방법

result2 = sorted(list(dict.fromkeys(numbers)))
print(result2) # [1, 2, 3, 4, 5]


2. 학생 성적 관리 및 평균 계산
```python
# 학생들의 성적을 딕셔너리로 관리
students = {
    '홍길동': [90, 85, 88],
    '김철수': [78, 92, 84],
    '이영희': [95, 89, 93]
}

# 각 학생의 평균 성적 계산
student_averages = {}

for name, scores in students.items():
    average = sum(scores) / len(scores)
    student_averages[name] = round(average, 2)

print("학생별 평균 성적:")
for name, avg in student_averages.items():
    print(f"{name}: {avg}")

# 전체 학급 평균 계산
class_average = sum(student_averages.values()) / len(student_averages)
print(f"학급 전체 평균: {round(class_average, 2)}")

# 출력 결과:
# 학생별 평균 성적:
# 홍길동: 87.67
# 김철수: 84.67
# 이영희: 92.33
# 학급 전체 평균: 88.22
  1. 세트 연산 예제
    # 두 개의 세트 생성
    fruits1 = {'사과', '바나나', '오렌지', '포도'}
    fruits2 = {'바나나', '키위', '포도', '망고'}
    

교집합 (두 세트에 모두 있는 과일)

intersection = fruits1 & fruits2
print("교집합:", intersection) # {'바나나', '포도'}

합집합 (모든 과일 목록)

union = fruits1 | fruits2
print("합집합:", union) # {'사과', '바나나', '오렌지', '포도', '키위', '망고'}

차집합 (fruits1에만 있는 과일)

difference1 = fruits1 - fruits2
print("fruits1 차집합:", difference1) # {'사과', '오렌지'}

차집합 (fruits2에만 있는 과일)

difference2 = fruits2 - fruits1
print("fruits2 차집합:", difference2) # {'키위', '망고'}

대칭차집합 (한쪽에만 있는 과일들)

symmetric_difference = fruits1 ^ fruits2
print("대칭차집합:", symmetric_difference) # {'사과', '오렌지', '키위', '망고'}

```

각 연습문제의 해설:

1번 문제는 두 가지 방법을 보여줍니다:

  • set을 활용한 방법은 중복을 자동으로 제거해주는 set의 특성을 활용합니다.
  • dict.fromkeys를 사용한 방법도 중복을 제거하는 또 다른 방식입니다.

2번 문제는 중첩 데이터 구조를 다루는 방법을 보여줍니다:

  • 딕셔너리 안에 리스트를 저장하여 각 학생의 성적을 관리합니다.
  • for 루프와 딕셔너리 메서드를 활용하여 데이터를 처리합니다.
  • round() 함수로 소수점을 관리합니다.

3번 문제는 세트의 다양한 연산을 보여줍니다:

  • 교집합, 합집합, 차집합, 대칭차집합 등 세트의 모든 주요 연산을 다룹니다.
  • 연산자와 메서드 두 가지 방식 모두 사용 가능합니다.

이러한 예제들을 통해 실제 프로그래밍에서 컬렉션을 어떻게 활용하는지 이해할 수 있습니다. 다양한 방식으로 문제를 해결하는 것을 연습해보세요! 😊

다음 글은 객체지향 프로그래밍(OOP)로 돌아오겠습니다:)

728x90
300x250