Python 기초 5장 - 컬렉션(Collections) 완벽 가이드
안녕하세요! 오늘은 Python의 핵심 데이터 구조인 컬렉션(Collections)에 대해 자세히 알아보겠습니다. Python의 컬렉션은 여러 데이터를 효율적으로 저장하고 관리할 수 있게 해주는 데이터 구조입니다.
목차
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의 컬렉션은 각각의 특징과 장단점이 있습니다. 상황에 맞는 적절한 컬렉션을 선택하여 사용하면 더 효율적인 프로그래밍이 가능합니다. 실제 프로젝트에서는 이러한 컬렉션들을 조합하여 사용하는 경우가 많으니, 각각의 특징을 잘 이해하고 활용하시기 바랍니다.
연습문제
다음 리스트에서 중복을 제거하고 정렬하세요:
numbers = [1, 3, 2, 2, 5, 4, 3, 1, 5]
학생들의 성적을 관리하는 딕셔너리를 만들고, 평균을 계산하세요.
두 개의 세트를 만들고 교집합, 합집합, 차집합을 구하세요.
연습문제 답안
- 리스트의 중복 제거 및 정렬
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
- 세트 연산 예제
# 두 개의 세트 생성 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)
로 돌아오겠습니다:)
'Python' 카테고리의 다른 글
Python 기초 6장 - 객체지향 프로그래밍(OOP) (0) | 2024.12.02 |
---|---|
Python 기초 4장 - 함수(Functions) 완벽 가이드 (0) | 2024.11.27 |
Python PEMDAS-LR - 파이썬 연산자 우선순위와 계산 방향 이해하기 (0) | 2024.11.27 |
Python 기초 3장 - 연습문제 답안 (0) | 2024.11.27 |
Python 기초 3장 - 제어문 완벽 가이드 (0) | 2024.11.26 |