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 |