728x90
반응형

< 사전 >

 

> 키와 값의 쌍

사전(Dictionary)키와 값의 쌍을 저장하는 대용량의 자료구조이다.

해시 알고리즘을 사용하여 일대일로 대응되는 특성이 있어 이라고도 부르고 관련된 키와 값의 쌍이라고 해서 연관배열이라고도 부른다.

 

다른 언어는 라이브러리로 제공하는 고급자료구조이지만 파이썬은 언어의 기본 기능으로 제공하여 언제든지 사용할 수 있다.

사전을 정의 할 때는 { } 괄호 안에 키:값 형태로 콤마로 구분하여 나열한다.

# dic

dic = {"boy": "소년", "school": "학교", "book": "책"}
print(dic)  # {'boy': '소년', 'school': '학교', 'book': '책'}

* 영어 단어가 키이고 한글을 값으로 하는 세 쌍의 요소를 사전에 저장

Key Value
boy 소년
school 학교
book

* 키는 값을 찾는 기준이어서 중복되지 않는 고유의 값을 가져야 하지만 값은 중복되어도 상관 없다.

 

키는 읽기 전용이어서 변경할 수 없으며 그래서 튜플은 키로 쓸 수 있지만 리스트는 안 된다.

값은 자유롭게 변경할 수 있다.

 

print 함수는 사전을 { } 괄호로 묶어 출력하는데 정의할 때의 순서와는 다르게 출력된다.

사전은 빠른 검색을 위해 키로부터 저장하는 위치를 결정하며 최대한 찾기 쉬운 위치에 저장하기 때문에 순서를 유지하지 않는다.

대신 검색이 엄청나게 빨라 거의 실시간으로 찾아낸다.

사전에 대해 [키] 형식으로 읽으면 값이 바로 구해진다.

# dic read

dic = {'boy': '소년', 'school': '학교', 'book': '책'}
print(dic['boy'])   # 소년
print(dic['book'])  # 책
# dic get

dic = {'boy': '소년', 'school': '학교', 'book': '책'}
print(dic.get('student'))   # None
print(dic.get('student', '사전에 없는 단어입니다.'))    # 예외처리구문

* 찾는 키가 없으면 키가 없다는 예외 발생하므로 예외 처리구문을 사용해야 한다.

예외 처리구문으로 감싸는 게 불편하다면 이때는 get 메서드로 값을 찾는다.

get 은 키가 없을 때 에러를 발생시키는 대신 None 을 리턴하며 두 번째 인수로 대신 돌려줄 디폴트 값을 지정할 수도 있다.

 

# dic in

dic = {'boy': '소년', 'school': '학교', 'book': '책'}

if 'student' in dic:
    print("사전에 있는 단어입니다.")
else:
    print("이 단어는 사전에 없습니다.")

이 단어는 사전에 없습니다.

* " 키 in 사전" 조건문은 키가 있으면 True 를 리턴하고 그렇지 않으면 False 를 리턴한다.

사전에 없는 단어인지 알고 싶으면 not in 구문을 사용한다.

 

> 사전 관리

사전은 변경 가능한 자료형이어서 실행 중에 삽입, 삭제, 수정 등의 편집을 자유롭게 할 수 있다.

[ ] 괄호와 대입문을 주로 사용한다.

# dic change

dic = {'boy': '소년', 'school': '학교', 'book': '책'}

dic['boy'] = '남자애'
dic['girl'] = '소녀'
del dic['book']
print(dic)  # {'boy': '남자애', 'school': '학교', 'girl': '소녀'}

* 똑같은 대입문인데 키의 존재 여부에 따라 동작이 다르다. 있으면 수정, 없으면 추가다.

요소를 삭제할 때는 del 명령을 사용하며 해당 키를 찾아 값과 함께 사전에서 삭제한다.

사전의 모든 요소를 삭제하여 완전히 비울 때는 clear 메서드를 호출한다.

 

# keys

dic = {'boy': '소년', 'school': '학교', 'book': '책'}

print(dic.keys())   # dict_keys(['boy', 'school', 'book'])
print(dic.values()) # dict_values(['소년', '학교', '책'])
print(dic.items())  # dict_items([('boy', '소년'), ('school', '학교'), ('book', '책')])

* 사전의 키, 값, 키와 값의 쌍을 튜플로 묶은 객체 리턴

 

# key list

dic = {'boy': '소년', 'school': '학교', 'book': '책'}

keylist = dic.keys()
for key in keylist:
    print(key)

boy
school
book
# dic update

dic = {'boy': '소년', 'school': '학교', 'book': '책'}
dic2 = {'student': '학생', 'teacher': '선생님', 'book': '서적'}
dic.update(dic2)
print(dic)

# {'boy': '소년', 'school': '학교', 'book': '서적', 'student': '학생', 'teacher': '선생님'}

* update 메서드는 두 개의 사전을 병합한다.

인수로 전달한 사전이 호출 사전에 병합되어 합쳐진다.

 

# list to dic

li = [['boy', '소년'], ['school', '학교'], ['book', '책']]
dic = dict(li)

print(dic)
# {'boy': '소년', 'school': '학교', 'book': '책'}

* 리스트에 중복 되는 키가 있으면 뒤쪽에 있는 키의 값이 적용된다.

구조만 맞다면 튜플도 사전으로 바꿀 수 있다.

컬렉션은 값의 집합이라는 면에서 공통성이 있어 상호 변환이 자유로운 편이다.

 

> 사전의 활용

사전은 키의 중복을 허락하지 않는다는 점과 연관된 정보를 저장한다는 면에서 무척 실용적이다.

이 특성을 이용하면 대량의 정보를 저장할 수 있을 뿐만 아니라 빠른 속도로 검색까지 할 수 있다.

[ ] 괄호만으로 추가 및 수정이 가능해 사용하기도 쉽다.

# alpha num

song = """by the rivers of babylon, there we sat down
yeah we wept, when we remember zion.
when the wicked carried us away in captivity
required from us a song
now how shall we sing the lord's song in a strange land"""

alphabet = dict()
for c in song:
    if c.isalpha() == False:
        continue
    c = c.lower()
    if c not in alphabet:
        alphabet[c] = 1
    else:
        alphabet[c] += 1

print(alphabet)

< 집합 >

 

> 집합 정의

집합은 여러 가지 값의 모임이며 중학교 수학 시간에 배운 집합과 같다.

다른 자료형보다는 다소 늦게 파이썬 2.3부터 도입되었는데 그만큼 실용성이 낮다는 얘기이기도 하다.

집합을 정의 할 때는 { } 괄호 안에 키를 콤마로 구분하여 나열한다.

 

사전을 정의하는 괄호와 같지만 값은 없고 키만 있다는 점이 다르다.

# set

asia = {'korea', 'china', 'japan', 'korea'}
print(asia)	# {'korea', 'china', 'japan'}

* 집합은 값을 포함하고 있느냐 아니냐만 중요할 뿐이어서 키의 중복은 허락하지 않으며 순서도 별 의미가 없다.

# set_2

print(set("sanghyung"))
print(set("[12, 34, 56, 78"))
print(set(("신지희", "한주완", "김태륜")))
print(set({'boy': '소년', 'school': '학교', 'book': '책'}))
print(set())

{'u', 'h', 'y', 'n', 'g', 'a', 's'}
{'2', '4', '[', ',', '5', '6', ' ', '8', '1', '7', '3'}
{'김태륜', '한주완', '신지희'}
{'boy', 'school', 'book'}
set()

* set() 함수는 빈 집합을 만들기도 하고 다른 컬렉션을 집합형으로 변환하기도 한다.

 

문자열은 개별 문자들이 집합의 원소가 되는데 중복이 제거된다는 점을 유의

리스트나 튜플도 집합으로 바꿀 수 있고 사전은 키만 쏙 빼내 오며 값은 버린다.

집합은 수정 가능한 자료형이어서 언제든지 키를 넣고 뺄 수 있다.

집합에 원소를 추가할 때는 add 메서드를 사용하며

집합에 원소를 제거할 때는 remove 메서드를 사용한다.update 메서드는 집합끼리 결합하여 합집합을 만든다.

 

# set edit

asia = {'korea', 'china', 'japan'}

asia.add('vietnam')	# 추가
asia.add('china')	# 추가 안됨(중복)
asia.remove('japan')	# 제거
print(asia) # {'vietnam', 'korea', 'china'}

asia.update({'singaore', 'hongkong', 'korea'})
print(asia) # {'vietnam', 'korea', 'singaore', 'hongkong', 'china'}

* 집합은 중복을 허락하지 않음을 유의

 

> 집합 연산

집합으로부터 여러가지 연산을 하여 집합끼리 조합한다.

합집합, 교집합 정도는 중학교 때 배운 것이라 쉽다.

연산 기호 메서드 설명
합집합 | union 두 집합의 모든 원소
교집합 & intersection 두 집합 모두에 있는 원소
차집합 - difference 왼쪽 집합의 원소 중
오른쪽 집합의 원소를 뺀 것
배타적 차집합 ^ symmetric_difference 한쪽 집합에만 있는
원소의 합
# set op

twox = {2, 4, 6, 8, 10, 12}
threex = {3, 6, 9, 12, 15}

print("교집합", twox & threex)  # 교집합 {12, 6}
print("합집합", twox | threex)  # 합집합 {2, 3, 4, 6, 8, 9, 10, 12, 15}
print("차집합", twox - threex)  # 차집합 {8, 2, 10, 4}
print("차집합", threex - twox)  # 차집합 {9, 3, 15}
print("배타적차집합", twox ^ threex)    # 배타적차집합 {2, 3, 4, 8, 9, 10, 15}
728x90
반응형

'Language > Python' 카테고리의 다른 글

Jump to Python_Source code  (0) 2022.08.26
Python_11. Collection Management  (0) 2022.08.03
Python_09. List and Tuple  (0) 2022.08.01
Python_08. String management  (0) 2022.07.31
Python_07. Function  (0) 2022.07.31

+ Recent posts