파이썬 기초 문법 4

윤수환·2025년 3월 23일

1. 딕셔너리 개요

  • key와 value의 쌍을 저장하는 대용량 자료구조로 우리가 사용하는 사전과 동일한 형태를 가지고 있음

  • e.g., 영어 사전) key: 검색 단어, value: 뜻

  • { } 안에 key:value 형태로 , 로 구분하여 나열

    • dic = {key1: value1, key2: value2 ... } 형태로 사용
    • key-value pair 형태로 저장되며, key와 value는 1:1 대응되는 형태로 연관 배열(Associative array) 또는 맵(map)이라고도 함
  • 내부적으로는 hash 를 사용하여 key를 저장함

  • 순서가 없는 타입이었으나 Python 3.7부터는 삽입 순서 유지


HASH

  • 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수 - wikipedia -

  • 컴퓨터 시스템에서 데이터를 처리하는 기본적인 기능은 크게 Create(생성), Read(읽기/검색), Update(갱신/수정), Delete(삭제)로 구분할 수 있으며 이를 CRUD operation 이라 함.

  • 이러한 개념은 HTTP 프로토콜에도 적용되어, POST, GET, PUT, DELETE method로 사용된다.

  • 일반적인 컴퓨터 시스템에서 가장 중요한 operation은 ? Search(Read)

  • 여러 개의 자료 중에서 원하는 자료를 찾는 작업으로 컴퓨터가 가장 많이 하는 작업 중의 하나
  • 검색을 효율적으로 수행하는 것은 매우 중요
  • 검색을 위해서는 항목과 항목을 구별해주는 key인 Search Key가 필요
  • 검색에 사용되는 자료 구조: Array, List, Dictionary

Sequential Search(순차 탐색)

  • 검색 방법 중에서 가장 간단하고 직접적인 검색 방법
  • 정렬되지 않은 array 또는 list 를 처음부터 마지막까지 하나하나 검사하는 방법
  • 시간 복잡도: O(n)

Binary Search(이진 탐색)

  • 정렬된 Array 또는 List의 검색에 적합

  • Array 또는 List의 중앙에 있는 값을 조사하여 찾고자 하는 항목이 왼쪽 또는 오른쪽 부분 Array 또는 List에 있는지 비교하여 검색의 범위를 반으로 줄여가며 검색 진행

  • 시간복잡도는 O(log2N)
    e.g., 70억 명중에서 특정한 이름 탐색

    • 이진탐색 : 단지 33번의 비교 필요
    • 순차 탐색 : 최악의 경우 70억 번의 비교 필요

HASHING

  • 대부분의 탐색 방법들은 키 값 비교로써 탐색하고자 하는 항목에 접근 Hashing은 키 값에 대한 산술적 연산에 의해 테이블의 주소를 계산하여 항목에 접근하는 방식임
  • 키 값의 연산에 의해 직접 접근이 가능한 구조
  • 키를 입력받아 해시 주소(hash address) 생성
  • 이 해시 주소가 해시 테이블(hash table)의 index로 사용
  • 검색 시 hash(key) 결과를 index로 사용하면 직접 접근 가능
  • 이론적으로 Hash의 시간 복잡도는 O(1) 임
  • Python의 Dictionary는 입력받은 key 값을 내부적으로 hash 한 후 사용
infoDic = {'roomId': 1, 'name': '휴게실', 'temp': 22.5, 'humidity': 60, 1:True, 2:False }
print(infoDic)
print(type(infoDic))
  • key 는 중복될 수 없으며, 중복될 경우 마지막에 삽입한 key의 value 값으로 저장 (value가 중복되는 것은 가능)
subject = {'kor': '0101', 'eng': '0102', 'math': '0103', 'kor': '0100'}
print(subject)
subject = {'kor': '0101', 'eng': '0102', 'math': '0103', 'art': '0103'}
print(subject)

비어있는 Dictionary 생성

  • DICTNAME = dict() 또는 DICTNAME = {} 를 사용하여 비어있는 Dictionary 생성 가능
a = dict()
print(a)
print(type(a))

b = {}
print(b)
print(type(b))

2. Dictionary indexing

2.1 개별 요소 추출

  • dic[key] 로 개별 요소 추출
  • key로 접근 가능하며 dic[key] 형태로 사용한다.
  • dictionary는 순서가 없는 타입이므로, index로 접근이 불가능함
  • Python 3.7부터는 삽입 순서 유지
  • 추출하고자 하는 key가 존재하지 않으면 Error 반환

키로 접근 가능

subject = {'kor': '0101', 'eng': '0102', 'math': '0103'}
subject['eng']

인덱스 접근 불가능, Error

subject[0]

존재하지 않는 키 사용, Error

subject['sci']

rank = {1: '삼성전자', 2:'SK하이닉스', 3:'카카오'}
rank[1]

get(key [, value]) 로 개별 요소 추출

  • 앞에서 살펴본 dic[key] 와는 달리 검색 실패 시 Error 대신 None 을 반환
  • value: 검색 실패 시 출력할 값 지정
subject = {'kor': '0101', 'eng': '0102', 'math': '0103'}
code = subject.get('math')
print(code)   # 0103
  • 키가 없다면 None 값 반환
code = subject.get('game')
print(code)   # None
  • 검색 실패 시 출력할 값을 지정할 수 있음 (Default: None)
code = subject.get('game', 'unknown')
print(code)   # unknown

2.2 요소 추가 & 수정 & 삭제

요소 추가 DICTNAME[key] = value

subject['sci'] = '0110'
print(subject)

요소 삭제 del DICTNAME[key] 또는 del(DICTNAME[key])

  • clear() 를 사용하면 dictionary 내 모든 요소를 삭제
  • key 값 없이 del DICTNAME 또는 del(DICTNAME) 로 사용할 경우 dictionary 자체를 삭제
print(subject)  # {'kor': '0101', 'eng': '0102', 'math': '0103', 'sci': '0110'}


del subject['math']  # 'math'를 key로 가지는 요소 삭제
print(subject)              # {'kor': '0101', 'eng': '0102', 'sci': '0110'}
del(subject['eng'])  # 'eng'를 key로 가지는 요소 삭제
print(subject)              # {'kor': '0101', 'sci': '0110'}


subject.clear()
print(subject)              # {}, 모든 요소가 삭제되었으나 dictionary는 남아 있음


del(subject)
print(subject)              # subeject 자체가 삭제되었음

2.3 여러 요소 동시에 추가 & 수정

  • DICTNAME.update({key, value ...}) 형태로 사용함
a = {'a':1, 'b':2, 'c':3}
a.update({'b':22, 'c':33})  # 여러 요소 동시 수정
print(a)     # {'1': 1, '2': 22, '3': 33}
a.update({'d':44, 'e':55})  # key가 없으면 추가
print(a)     # {'1': 1, '2': 22, '3': 33, '4': 44, '5': 55}

포함 여부 확인 key in DICTNAME, key not in DICTNAME

  • 사용법은 List의 in 연산자와 동일
  • 단, dictionary에서는 key에 대한 in 연산자만 사용 가능
a = {'a':1, 'b':2, 'c':3}
print('b' in a)   # True
print('d' in a)   # False

3. Dictionary 함수

3.1 List 생성

  • key로만 구성된 List 생성 keys()
subject = {'kor': '0101', 'eng': '0102', 'math': '0103', 'sci': '0110'}
name = subject.keys()  # key 추출
print(name)  # dict_keys(['kor', 'eng', 'math', 'sci'])
type(name)   # <class 'dict_keys'>
  • value로만 구성된 List 생성 values()
subject = {'kor': '0101', 'eng': '0102', 'math': '0103', 'sci': '0110'}
code = subject.values()   # value 추출
print(code)               # dict_values(['0101', '0102', '0103', '0110'])
type(code)                # <class 'dict_values'>
  • key와 value로 구성된 List 생성 items()
subject = {'kor': '0101', 'eng': '0102', 'math': '0103', 'sci': '0110'}
subCode = subject.items() # key와 value 추출
print(subCode)  # dict_items([('kor', '0101'), ('eng', '0102'), ('math', '0103'), ('sci', '0110')])
type(subCode)   # <class 'dict_items'>
  • List로 변환 list()
subject = {'kor': '0101', 'eng': '0102', 'math': '0103', 'sci': '0110'}
name = subject.keys()     # key 추출
nameList = list(name)     # name dict_keys 를 list로 변환
print(nameList)           # ['kor', 'eng', 'math', 'sci']
type(nameList)            # <class 'list'>


code = subject.values()   # value 추출
codeList = list(code)     # code dict_values 를 list로 변환
print(codeList)           # ['0101', '0102', '0103', '0110']


subCode = subject.items() # key와 value 추출
subCodeList = list(subCode) #subCode dict_items 를 list로 변환
print(subCodeList)        # [('kor', '0101'), ('eng', '0102'), ('math', '0103'), ('sci', '0110')]
  • List나 Tuple을 Dictionary로 변환 dict()

    • List | Tuple in List 또는 List| Tuple in Tuple 형태 중 key와 value 가 순서에 맞게 저장되어 있다면 dictionary로 변환 가능
subjectList = [['kor', '0101'], ['eng', '0102'], ['math', '0103'], ['sci', '0110']]
subjectDic = dict(subjectList)  # list를 dictionary로 변환
print(subjectDic) # {'kor': '0101', 'eng': '0102', 'math': '0103', 'sci': '0110'}
type(subjectDic)  # <class 'dict'>

a = [1, 2, 3]
b = dict(a)

0개의 댓글