1. 사전 객체의 기초 연산
- 내부적으로 해쉬(Hash)라는 기법을 이용하여 자료 저장
- 자료의 순서를 가지지 않는다.
- 값은 임의의 객체가 될 수 있지만, 키는 변경 불가능(Immutable) 자료형이어야 한다.
- 문자열, 숫자, 튜플은 키가 될 수 있지만 리스트, 사전은 키가 될 수 없다.
>>> member = {'basketball': 5, 'soccer':11, 'baseball':9}
>>> member['baseball'] # 검색
9
>>> member['volleyball'] = 7 # 새 값 설정
>>> member
{'soccer': 11, 'basketball': 5, 'baseball': 9, 'volleyball': 7}
>>> member['volleyball'] = 10 # 변경
>>> member
{'soccer': 11, 'basketball': 5, 'baseball': 9, 'volleyball': 10}
>>> len(member) # 길이
4
>>> del member['baseball'] # 항목 삭제
>>> def add(a, b):
return a+b
>>> def sub(a, b):
return a-b
>>> action = {0:add, 1:sub} # 함수를 키나 값으로 활용
>>> action[0](4, 5)
9
>>> action[1](4, 5)
-1
※ 다양한 방법으로 사전 객체 생성하기
{}
>>> dict(one=1, two=2) # 키워드 인수를 지정하여 사전 생성
{'two': 2, 'one': 1}
>>> dict([('one', 1), ('two', 2)]) # (key, value) 쌍의 시퀀스로부터 사전 생성
{'two': 2, 'one': 1}
>>> dict({'one':1, 'two':2}) # 사전 객체를 인수로 받아 새로운 사전 생성
{'two': 2, 'one': 1}
>>> keys = ['one', 'two', 'three']
>>> values = (1, 2, 3)
>>> zip(keys, values) # zip은 자료를 순서대로 묶어줌
[('one', 1), ('two', 2), ('three', 3)]
>>> dict(zip(keys, values))
{'three': 3, 'two': 2, 'one': 1}
2. 사전 객체의 메쏘드
>>> phone = {'jack': 9465215, 'jim': 1111, 'Joseph': 6584321}
>>> phone.keys() # 키의 리스트를 반환
['jim', 'Joseph', 'jack']
>>> phone.values() # 값의 리스트를 반환
[1111, 6584321, 9465215]
>>> phone.items() # (키, 값)의 리스트를 반환
[('jim', 1111), ('Joseph', 6584321), ('jack', 9465215)]
>>> 'jack' in phone # 'jack'이 phone의 키에 포함되어 있는가?
True
>>> 'lee'in phone
False
>>> p = phone # 사전 레퍼런스 복사(사전 객체는 공유됨)
>>> phone['jack'] = 1234 # 변경
>>> phone
{'jim': 1111, 'Joseph': 6584321, 'jack': 1234}
>>> p # phone과 동일하게 변경됨
{'jim': 1111, 'Joseph': 6584321, 'jack': 1234}
>>> ph = phone.copy() # 사전 복사(별도의 사전 객체를 리턴)
>>> phone['jack'] = 1111 # 변경
>>> ph # phone과 다른 객체이기 때문에 변경 안되었음
{'jim': 1111, 'Joseph': 6584321, 'jack': 1234}
>>> ph.get('jack') # 'jack'키에 대한 값을 얻음
1234
>>> ph.get('creaplz') # 값이 없는 경우 None을 리턴
>>> ph['creaplz'] # ph['creaplz']는 값이 없는 경우 예외를 발생
Traceback (most recent call last):
File "<pyshell#98>", line 1, in <module>
ph['creaplz']
KeyError: 'creaplz'
>>> ph.get('creaplz', 510) # 인수를 하나 더 써주면, 존재하지 않는 키인데도 지정한 인수를 리턴
510
>>> ph # 사전에는 변화 없음
{'jim': 1111, 'Joseph': 6584321, 'jack': 1234}
>>> ph.setdefault('creaplz', 510) # 'creaplz'의 값을 꺼내되, 없으면 510로 설정
510
>>> ph # 'creaplz': 510이 설정
{'jim': 1111, 'Joseph': 6584321, 'jack': 1234, 'creaplz': 510}
>>> ph.popitem() # 한 아이템을 꺼냄
('jim', 1111)
>>> ph.popitem() # 또 한 아이템을 꺼냄
('Joseph', 6584321)
>>> ph # popitem 결과
{'jack': 1234, 'creaplz': 510}
>>> ph.pop('jack') # 지정한 키를 pop
1234
>>> ph
{'creaplz': 510}
>>> phone.update(ph) # 사전 phone의 내용을 ph으로 추가 갱신
>>> phone
{'jim': 1111, 'Joseph': 6584321, 'jack': 1234, 'creaplz': 510}
>>> phone.clear() # 사전의 모든 입력을 제거
>>> phone
{}
3. 심볼 테이블
>>> b = 100
>>> name = 'creaplz'
>>> dic = {'Python': 'Good', 'Perl': 'Not Good'}
>>> globals() # 전역 영역(모듈 영역)의 심볼 테이블(사전) 얻음
{'a': 1, 'b': 100, 'name': 'creaplz', '__builtins__': <module '__builtin__' (built-in)>, 'dic': {'Python': 'Good', 'Perl': 'Not Good'}, '__name__': '__main__', '__doc__': None}
>>> locals() # 지역 영역의 심볼 테이블 얻음(대화형 최상위 모드에서는 globals()와 별 차이가 없음)
{'a': 1, 'b': 100, 'name': 'creaplz', '__builtins__': <module '__builtin__' (built-in)>, 'dic': {'Python': 'Good', 'Perl': 'Not Good'}, '__name__': '__main__', '__doc__': None}
>>> class C:
x = 10
y = 20
>>> C.__dict__ # 클래스의 심볼 테이블 얻음
{'y': 20, 'x': 10, '__module__': '__main__', '__doc__': None}
>>> c = C() # 객체 생성
>>> c.a = 100
>>> c.b = 200
>>> c.__dict__ # 클래스 인스턴스의 심볼 테이블 얻음
{'a': 100, 'b': 200}
>>> def f():
pass
>>> f.b = 2
>>> f.__dict__ # 함수의 심볼 테이블 얻음
{'a': 1, 'b': 2}
4. 사전을 for문으로 참조하기
>>> D = {'a': 1, 'b': 2, 'c': 3}
>>> for key in D: # 사전 자체 이용
print key, D[key]
a 1
c 3
b 2
>>> for key, value in D.items():
print key, value
a 1
c 3
b 2
>>> items = D.items()
>>> items.sort() # 순서 정렬(키 기준)
>>> items
[('a', 1), ('b', 2), ('c', 3)]
>>> for k, v in items:
print k, v
a 1
b 2
c 3
>>> # 정렬된 결과를 한번만 이용하기
>>> for key, value in sorted(d.items()): # 순서 정렬(키 기준)
print key, value
one 1
three 3
two 2
>>> for key, value in sorted(d.items(), key=lambda item:item[1]): # 순서 정렬(값 기준)
print key, value
one 1
two 2
three 3