[자료구조] Dictionary(Map), Set
Dictionary(Map) 소개
Dictionary(Map)의 개념과 특징
파이썬의 Dictionary는 key와 value의 쌍으로 이루어진 데이터 구조입니다. 이러한 형식은 매핑(mapping) 형태로, 특정 key를 통해 대응되는 value에 접근할 수 있습니다.
my_dict = {'apple': 1, 'banana': 2, 'cherry': 3}
print(my_dict['apple']) # 출력: 1
Dictionary의 주요 특징 중 하나는 key를 통해 데이터에 빠르게 접근할 수 있다는 점입니다.또한, key는 변경 불가능(immutable)한 데이터 타입만 사용할 수 있으며, 각 key는 고유해야 합니다. value는 어떠한 데이터 타입도 가능하며, 중복이 허용됩니다.
Dictionary(Map)과 List/Array의 비교
List와 Array는 순서가 있는(ordered) 데이터 구조이며, 인덱스를 통해 각 요소에 접근합니다. 반면, Dictionary는 순서가 없는(unordered) 데이터 구조로, key를 통해 value에 접근합니다.
따라서, List와 Array는 데이터의 순서가 중요하거나, 인덱스를 통한 접근이 필요한 경우 사용됩니다. Dictionary는 key-value 관계를 가진 데이터를 저장하고 처리하는데 적합합니다.
Dictionary(Map) 기본 동작
Dictionary의 생성과 초기화 방법
Dictionary는 중괄호({}
) 안에 key-value 쌍을 콜론(:
)으로 연결하여 초기화합니다.
# 빈 dictionary 생성
my_dict = {}
# key-value 쌍을 가진 dictionary 생성
my_dict = {'apple': 1, 'banana': 2, 'cherry': 3}
print(my_dict)
#출력: {'apple': 1, 'banana': 2, 'cherry': 3}
Dictionary의 요소 접근 방법과 수정
Dictionary의 요소는 key를 통해 접근합니다.
my_dict = {'apple': 1, 'banana': 2, 'cherry': 3}
print(my_dict['apple']) # 출력: 1
또한, 존재하는 key의 value를 변경하거나 새로운 key-value 쌍을 추가할 수 있습니다.
my_dict = {'apple': 1, 'banana': 2, 'cherry': 3}
# value 변경
my_dict['apple'] = 4
print(my_dict) # 출력: {'apple': 4, 'banana': 2, 'cherry': 3}
# 새로운 key-value 추가
my_dict['mango'] = 5
print(my_dict) # 출력: {'apple': 4, 'banana': 2, 'cherry': 3, 'mango': 5}
Dictionary의 크기와 요소 삭제
len()
함수를 사용하여 Dictionary의 크기(즉, key-value 쌍의 개수)를 알 수 있습니다.
my_dict = {'apple': 1, 'banana': 2, 'cherry': 3}
print(len(my_dict)) # 출력: 3
del
키워드나 pop()
메서드를 사용하여 Dictionary의 요소를 삭제할 수 있습니다.
코드텍스트
my_dict = {'apple': 1, 'banana': 2, 'cherry': 3}
# del 키워드를 사용한 요소 삭제
del my_dict['apple']
print(my_dict) # 출력: {'banana': 2, 'cherry': 3}
# pop() 메서드를 사용한 요소 삭제
my_dict.pop('banana')
print(my_dict) # 출력: {'cherry': 3}
Dictionary (Map)의 활용
Dictionary를 활용한 키-값 쌍 추가 및 조회
Dictionary에 새로운 키-값 쌍을 추가하는 방법은 간단합니다. 새로운 키를 지정하고 해당 키에 값을 할당하면 됩니다.
my_dict = {'apple': 1, 'banana': 2}
my_dict['cherry'] = 3
print(my_dict) # 출력: {'apple': 1, 'banana': 2, 'cherry': 3}
Dictionary의 키를 이용하여 해당 키에 대응하는 값을 조회할 수 있습니다.
my_dict = {'apple': 1, 'banana': 2}
print(my_dict['banana']) # 출력: 2
Dictionary의 반복문 활용
Dictionary는 키-값 쌍으로 이루어져 있어서, 이를 반복문에서 활용할 수 있습니다. 반복문을 통해 Dictionary의 모든 키-값 쌍에 접근하고 작업을 수행할 수 있습니다.
# 키만 사용하는 경우
for key in my_dict:
print(my_dict[key])
print(key)
# 출력:
# 1
# 2
# 3
# apple
# banana
# cherry
# 키와 값을 함께 사용하는 경우
for key, value in my_dict.items():
print(key, value)
# 출력:
# apple 1
# banana 2
# cherry 3
Set
Set의 개념과 특징
Set은 파이썬에서 제공하는 기본적인 자료형 중 하나입니다. 이름에서도 알 수 있듯이, Set은 수학에서의 집합과 유사한 개념을 가지고 있습니다.
Set은 다음과 같은 특징을 가지고 있습니다.
- 중복된 요소를 가질 수 없습니다. 각 요소는 유일(unique)해야 합니다.
- Set은 순서가 없습니다. 즉, 인덱스로 요소에 접근할 수 없습니다.
- Set은 변경 가능(mutable)합니다. 요소의 추가 또는 삭제가 가능합니다.
# Set의 생성
list = [1, 2, 3, 4, 5, 5, 5, 5, 2, 2, 1, 1, 0]
set1 = set(list)
my_set_ = {1, 2, 3, 4, 5, 0}
my_set = {1, 2, 3, 3, 3}
print(my_set) # 출력: {1, 2, 3}
Set과 List/Array의 차이점
Set과 List/Array는 다음과 같은 주요 차이점을 가지고 있습니다:
- 중복 요소: List/Array는 중복된 요소를 허용하지만, Set은 중복된 요소를 허용하지 않습니다.
- 순서: List/Array는 요소의 순서를 유지하지만, Set은 순서가 없습니다.
- 접근 방식: List/Array는 인덱스를 통해 요소에 접근할 수 있지만, Set은 인덱스로 접근할 수 없습니다.
이처럼 Set은 그 특성 상, 중복을 허용하지 않는 데이터의 모임을 다룰 때 효과적입니다. 다음 섹션에서는 Set의 기본적인 연산에 대해 알아보겠습니다.
Set 기본 동작
Set의 생성과 초기화 방법
Set은 중괄호 {}
또는 set()
함수를 사용해 생성할 수 있습니다. 빈 Set를 생성하려면 set()
을 사용해야 합니다. {}
만 사용하면, 이는 빈 Dictionary를 생성하게 됩니다.
# Set 생성
my_set = {1, 2, 3}
print(my_set) # 출력: {1, 2, 3}
# 빈 Set 생성
empty_set = set()
print(empty_set) # 출력: set()
Set에 요소 추가, 삭제
Set에 요소를 추가하려면 add()
메서드를, 여러 요소를 추가하려면 update()
메서드를 사용합니다. 요소를 삭제하려면 remove()
또는 discard()
메서드를 사용합니다.
my_set = {1, 2, 3}
# 요소 추가
my_set.add(4)
print(my_set) # 출력: {1, 2, 3, 4}
# 여러 요소 추가
my_set.update({5, 6})
print(my_set) # 출력: {1, 2, 3, 4, 5, 6}
# 요소 삭제
my_set.remove(1)
print(my_set) # 출력: {2, 3, 4, 5, 6}
Set의 크기와 중복 요소 제거
Set의 크기는 len()
함수를 사용해 확인할 수 있습니다. 또한, Set은 자동으로 중복된 요소를 제거하기 때문에, 중복 요소를 제거하려면 List나 Array를 Set으로 변환하면 됩니다.
my_set = {2, 3, 4, 5, 6}
# Set 크기 확인
print(len(my_set)) # 출력: 5
# 중복 요소 제거
my_list = [1, 2, 2, 3, 4, 4, 4, 5, 6, 6]
my_set = set(my_list)
print(my_set) # 출력: {1, 2, 3, 4, 5, 6}
Set의 활용
Set을 활용한 중복 요소 제거
Set은 중복된 요소를 가질 수 없으므로, List나 Array에서 중복 요소를 제거하는데 아주 유용합니다.
# List에 중복 요소가 있는 경우
my_list = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
# 이를 Set으로 변환하면 중복 요소가 제거됩니다.
my_set = set(my_list)
print(my_set) # 출력: {1, 2, 3, 4}
Set을 활용한 교집합, 합집합, 차집합 연산
Set은 교집합, 합집합, 차집합 등의 집합 연산을 지원합니다. 이는 각각 intersection()
, union()
, difference()
메서드를 통해 수행할 수 있습니다.
# 두 Set의 선언
set_A = {1, 2, 3, 4}
set_B = {3, 4, 5, 6}
# 교집합
print(set_A.intersection(set_B)) # 출력: {3, 4}
# 합집합
print(set_A.union(set_B)) # 출력: {1, 2, 3, 4, 5, 6}
# 차집합
print(set_A.difference(set_B)) # 출력: {1, 2}
실전 응용 예시
문자열 내의 중복 문자
주어진 문자열에서 중복된 문자를 찾는 문제입니다. 이를 위해 우리는 Set과 Dictionary를 조합해 사용할 것입니다.
def find_duplicates(s):
duplicates = set()
counts = {}
for letter in s:
if letter in counts and counts[letter] == 1:
duplicates.add(letter)
counts[letter] = counts.get(letter, 0) + 1
return duplicates
for letter in s:
duplicates.add(letter)
return duplicates
print(find_duplicates("hello world")) # 출력: {'h', 'l', 'o'}
모든 학생의 성적 계산
Dictionary와 List를 이용해 학생들의 성적을 계산하는 문제를 살펴보겠습니다. 각 학생의 이름을 키로, 그들의 성적을 값으로 하는 Dictionary를 사용하면 편리합니다.
def calculate_average_grades(grades):
averages = {}
for student, grades in grades.items():
averages[student] = sum(grades) / len(grades)
return averages
grades = {"John": [85, 90, 78], "Sarah": [92, 88, 90], "Mike": [70, 80, 75]}
print(calculate_average_grades(grades)) # 출력: {'John': 84.33333333333333, 'Sarah': 90.0, 'Mike': 75.0}
공통 요소 찾기
두 리스트에서 공통 요소를 찾는 문제를 살펴보겠습니다. 이를 위해 Set의 교집합 연산을 활용할 수 있습니다.
def find_common_elements(list1, list2):
return set(list1).intersection(list2)
print(find_common_elements([1, 2, 3, 4], [3, 4, 5, 6])) # 출력: {3, 4}
순서가 있는 딕셔너리 비교
from collections import OrderedDict
# 기본 딕셔너리
dict_a = {'a': 'apple', 'b': 'banana', 'p': 'pineapple'}
dict_b = {'b': 'banana', 'a': 'apple', 'p': 'pineapple'}
dict_a == dict_b
# True
OrderedDict
ordered_a = OrderedDict([('a', 'apple'), ('b', 'banana'), ('p', 'pineapple')])
ordered_b = OrderedDict([('b', 'banana'), ('a', 'apple'), ('p', 'pineapple')])
ordered_a == ordered_b
# False
기본 딕셔너리는 순서가 없습니다. 그래서 순서와 상관없이 Key와 Value 쌍이 동일하면 같다고 인식합니다. OrderedDict는 보통 Dictionary와 동일하지만 순서를 가지고 있습니다.
댓글남기기