본문 바로가기
Study/Python

[Python #5] Dictionary, Set, Collection

by YOONAYEON 2021. 10. 10.
Dictionary (사전)

 

 

- Dictionary : 키와 값의 쌍을 저장하는 대용량의 자료구조

 

 * 해시 알고리즘을 사용하여 일대일로 대응되는 특성이 있으므로 자바의 HashMap이랑 비슷

 * 파이썬에서는 내장되어 있으므로 라이브러리 없이 언제든지 사용 가능

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

 * 사전은 빠른 검색을 위해 해쉬를 이용한 키로부터 저장 위치를 결정 

 * 최대한 찾기 쉬운위치에 저장하므로 생성 시의 순서를 유지하지 않지만 검색 속도가 빠름

 * 키 : 값을 찾는 기준으로 고유의 값을 가지고 변경이 불가능  -> 튜플을 키로 쓸 수 있지만 리스트는 키로 쓸 수 없다!

 * 값 : 자유롭게 변경이 가능

 

- 사전 예시

dic = {'boy' : '소년', 'girl' : '소녀', 'study' : '공부'}
print(dic)	# {'boy' : '소년', 'girl' : '소녀', 'study' : '공부'} _순서가 다르게 출력될수도 있음
print(dic['boy'])	# 소년
print(dic['book'])	# 찾는 키가 없으면 오류발생
print(dic.get('book'))	# get메소드 사용시 None 반환
print(dic.get('book', '없는 단어입니다'))	# 반환값 설정 가능

 

- 사전 이용 예시

dic = {'boy' : '소년', 'girl' : '소녀', 'book' : '책'}
print(dic.keys())	# dict_key라는 key리스트 객체 반환
print(dic.values())	# dic_value라는 value리스트 객체 반환
print(dic.items())	# dic_itmes라는 k,v쌍을 튜플로 묶은 리스트 객체 반환

# 결과
# dict_keys(['boy', 'girl', 'book'])
# dic_values(['소년', '소녀', '책'])
# dic_items( [('boy','소년'), ('girl','소녀'), ('book','책')] )

 

* dict_ 객체는 진짜 리스트가 아니여서 편집함수 호출은 불가

* 진짜 리스트로 만들고 싶다면  list(dic.keys()) 이용

 

 

dic1 = {'boy' : '소년', 'girl' : '소녀', 'book' : '책'}
dic2 = {'school' : '학교', 'book' : '교재'}
dic1.update(dic2)	# dic1에 dic2를 병합한다. 중복된 키가 있을 시 dic2의 키값이 적용
print(dic1)
# {'boy' : '소년', 'girl' : '소녀', 'book' : '교재', 'school' : '학교'}

list = [ ['girl', '소녀'], ['boy', '소년'], ['book', '책'] ] # 2차원 리스트
dic = dict(list)	# 2차원 리스트를 사전으로 변경. 중복된 키의 경우 뒤의 값 적용
print(dic)
# {'girl': '소녀', 'boy': '소년', 'book': '책'}

 

 

 

 

Set (집합)

 

 

- Set : 키의 중복을 허락하지 않는 여러가지 값의 모임

 

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

 * 사전을 정의하는 괄호와 같지만 값은 없고 키만 있다는 점으로 구별

 * 키의 중복을 허락하지 않고 순서도 별 의미가 없음

 * 다른 자료형에 비해 실용성이 낮음

 

 

- 집합 예시

 

# 선언
set = {'apple', 'banana', 'melon', 'apple', 'tomato'}
print(set)	# 중복된 apple은 하나만 저장. 순서도 바뀜
# {'tomato', 'apple', 'banana', 'melon'}

# 변경
animals = {'cat', 'dog', 'tiger'}
animals.add('lion')	# 추가
animals.add('cat')	# 추가 안됨
animals.remove('tiger')	# 제거
print(animals)	# {'cat', 'dog', 'lion'}
animals.update( {'cat','bird'} )	# 여러개 추가. 이미 있는건 추가안됨
print(animals)	# {'cat', 'dog', 'lion', 'bird'}

# 다른 컬렉션을 집합형으로 변경가능
print(set("computer"))
print(set([12, 34, 56, 78]))
print(set(('홍길동', '성춘향', '김길동')))
print(set({'girl' : '소녀', 'boy' : '소년', 'book' : '책'}))	# 키만 저장
print(set())	# 빈집합
# 결과
# {'t', 'm', 'e', 'o', 'u', 'c', 'p', 'r'}
# {56, 34, 12, 78}
# {'성춘향', '김길동', '홍길동'}
# {'book', 'boy', 'girl'}
# set()

 

 

- 집합 연산

 : 집합으로부터 여러가지 연산을 이용하여 집합끼리 조합 가능

연산 기호 메소드 설명
합집합 | union 두 집합의 모든 원소
교집합 & intersection 두 집합 모두에 있는 원소
차집합 - difference 왼쪽 집합 원소 중 오른쪽 집합 원소를 뺀 것
배타적 차집합 ^ symmetric_difference 합집합에서 교집합을 뺀 것
부분집합 <= issubset 왼쪽이 오른쪽의 부분집합인지 조사
진성 부분집합 <   부분집합이면서 여분의 원소가 더 존재
포함집합 >= issuperset 왼쪽이 오른쪽 집합을 포함하는지 조사
진성 포함집합 >   포함집합이면서 여분의 원소가 더 존재

 

 

 

Collection 관리 함수

 

 

- enumerate

: 리스트의 순서값과 요소값을 튜플로 묶은 컬렉션을 리턴

 

enumerate( 컬렉션명, [, 시작값] )

 

* 리스트의 각 요소가 0부터 시작하는 순서값과 함께 출력

* 두번째인수로 시작값을 지정하면 해당 숫자부터 1씩 증가

* 요소를 모두 순회하며 읽어 내는 것

 

score = [88, 90, 70, 100, 99]
for no, s in enumerate(score, 1): 	# 순서값, 요소값으로 튜플 리스트 생성
	print(str(no) + "번의 성적은 ", s)

 

 

 

- zip

 : 여러 개의 컬렉션을 합쳐 하나로 만든다 (append X)

 

zip( 컬렉션1, 컬렉션2, ... )

 

* 두 리스트의 순서대로 대응되는 요소끼리 짝을 지어 튜플의 리스트 생성

* 두 개의 리스트를 병렬로 순회할 때 편리

 

 

day = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
food = ["Pasta", "Steak", "Cheese", "Toast"]
menu = zip(dayofweek, food)	# 두 리스트를 병합하여 새 리스트 생성
for d, f in menu:
	print("The menu of %s : %s" % (d, f))
    
# 결과
# The menu of Mon : Pasta
# The menu of Tue : Steak
# The menu of Wed : Cheese
# The menu of Thu : Toast

 

* 두 리스트의 길이가 다르면 짧은 쪽의 길이에 맞춰짐

* 생성되는 튜플의 순서는 원본 리스트의 순서와 같음

 

 

 

- filter

: 리스트의 요소 중 조건에 맞는 것만 골라내는 함수

 

filter( 필터링 조건 함수, 대상 리스트 )

* 가려낸 요소를 리스트로 반환

* 함수를 미리 정의해두고 인수에 이름 대입 또는 람다식 활용

 

 

def filter_func(s):
	return s < 60
    
score = [45, 89, 72, 53, 94]
for s in filter(filter_func, score):	# 조건함수, 검사하고자 하는 리스트
	print(s)			# 45, 53

 

 

 

- map

 : 모든 요소에 대해 변환 함수를 호출하여 새 요소값으로 구성된 리스트를 생성

 

map( 변환 함수, 대상 리스트)

 

* 첫 번째 인수의 변환 함수의 동작에 따라 요소값을 어떻게 변경할 것인지 결정

* 새롭게 변환한 값들로 새로운 리스트를 생성하여 반환

 

def half(s):	# 변환조건 함수
	return s / 2
    
score = [45, 89, 72, 53, 94]
for s in map(half, score):
	print(s, end=', ')		# 22.5, 44.5, 36.0, 26.5, 47.0,

 

 

- 리스트 복사

 

list1 = [1, 2, 3]
list2 = list1	# list2에 list1 대입

list2[1] = 4	# list2의 1번 인덱스값 변경
print(list1)	# [1, 4, 3]
print(list2)	# [1, 4, 3]

 

* 위의 예제에서 list2의 요소를 바꿨을 뿐인데 list1의 요소도 같이 바뀌었다. 왤까?

 -> 바로 두 리스트가 독립된 리스트가 아니라 같은 메모리를 가르키고 있기 때문이다

* 같은 리스트를 두 변수가 가리키고 있는 상황

* 어느 쪽을 바꿔도 상대편이 영향을 받음

* 두 리스트를 각각 독립적으로 만들고 싶다면 copy 메소드로 복사본을 생성!

 

list1 = [1, 2, 3]
list2 = list1.copy()

list2[1] = 4
print(list1)	# [1, 2, 3]
print(list2)	# [1, 100, 3]

 

* copy 메소드는 원본리스트와 똑같은 리스트를 새로 생성하여 리턴

* 메모리가 완전히 분리되어 별도의 저장소를 가지므로 한쪽을 바꿔도 영향을 받지 않음

* copy메소드 대신 list1[:] 로 전체범위에 대해 사본을 만들어도 됨

 

 

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

[Python #6] Network  (0) 2021.11.24
[Python #5] Class, Module, Package  (0) 2021.10.31
[Python #4] File  (0) 2021.10.07
[Python #3] String, List & Tuple  (0) 2021.10.05
[Python #2] Loop & Function  (0) 2021.09.23