딕셔너리는 key-value 쌍을 저장하는 자료구조이다. C++의 Map 또는 Unordered Map, 자바의 Map 또는 Hash Map과 유사하다. 각각의 key-value 쌍은 쉼표로 구분된다. 용도는 다르지만, 형식 자체는 Json과 유사하기도 하다.
>>> dic = {'name': 'pey', 'phone': '010-9999-1234', 'birth': '1118'}
① 딕셔너리에 추가
>>> a = {1: 'a'}
>>> a[2] = 'b'
>>> a
{1: 'a', 2: 'b'}
② 딕셔너리에서 삭제
>>> a
{1: 'a', 2: 'b', 'name': 'pey'}
>>> del a[1]
>>> a
{2: 'b', 'name': 'pey'}
① 정수 인덱싱 사용 불가
>>> grade = {'pey': 10, 'julliet': 99}
>>> grade['pey']
10
>>> grade['julliet']
99
② 중복 키 불허
>>> a = {1:'a', 1:'b'}
>>> a
{1: 'b'}
③ 키 값 불변 보장
① keys
>>> a = {'name': 'pey', 'phone': '010-9999-1234', 'birth': '1118'}
>>> a.keys()
dict_keys(['name', 'phone', 'birth'])
>>> list(a.keys())
['name', 'phone', 'birth']
② values
>>> a.values()
dict_values(['pey', '010-9999-1234', '1118'])
③ get
>>> a = {'name': 'pey', 'phone': '010-9999-1234', 'birth': '1118'}
>>> a.get('name') or a['name']
'pey'
get 메서드의 인자로 존재하지 않는 key가 입력되면 None을 반환하지만, 대괄호 안에 존재하지 않는 key를 입력하면 에러가 발생한다. key가 존재하지 않는지 확인하는 경우도 많기 때문에 get을 사용하는 것이 훨씬 안전한 방법이다. 참고로, get은 None을 대신할 디폴트 값을 설정하는 것도 가능하다.
>> a = {'name':'pey', 'phone':'010-9999-1234', 'birth': '1118'} >> print(a.get('nokey')) None >> a.get('nokey', 'foo') 'foo'
④ in
>>> a = {'name':'pey', 'phone':'010-9999-1234', 'birth': '1118'}
>>> 'name' in a
True
>>> 'email' in a
False
set 키워드를 이용하여 집합을 만들 수 있다. set의 소괄호 안에는 리스트를 입력할 수도 있고, 문자열을 입력할 수도 있다.
>>> s1 = set([1, 2, 3])
>>> s1
{1, 2, 3}
>>> s2 = set("Hello")
>>> s2
{'e', 'H', 'l', 'o'}
사실 파이썬의 Set은 자바의 Set과 동일하다. 즉, Java의 Set과 동일한 특징을 지닌다. 그 특징은 아래와 같다.
① 중복을 허용하지 않는다.
② 순서가 없다(Unordered).
>>> s1 = set([1, 2, 3])
>>> l1 = list(s1)
>>> l1
[1, 2, 3]
>>> l1[0]
1
Java에서 집합 연산은 메서드의 형태로 이루어지는 반면, 파이썬의 집합 연산은 간단한 기호로 이루어진다. 집합 연산의 예시에 사용하기 위해 아래와 같은 집합을 가정하자.
>>> s1 = set([1, 2, 3, 4, 5, 6])
>>> s2 = set([4, 5, 6, 7, 8, 9])
① 교집합
>>> s1 & s2
{4, 5, 6}
② 합집합
>>> s1 | s2
{1, 2, 3, 4, 5, 6, 7, 8, 9}
>>> s1.union(s2)
{1, 2, 3, 4, 5, 6, 7, 8, 9}
③ 차집합
>>> s1 - s2
{1, 2, 3}
>>> s1.difference(s2)
{1, 2, 3}
① add
>>> s1 = set([1, 2, 3])
>>> s1.add(4)
>>> s1
{1, 2, 3, 4}
② update
>>> s1 = set([1, 2, 3])
>>> s1.update([4, 5, 6])
>>> s1
{1, 2, 3, 4, 5, 6}
③ remove
>>> s1 = set([1, 2, 3])
>>> s1.remove(2)
>>> s1
{1, 3}