위키북스 박응용 저 "점프 투 파이썬" 책을 읽고 정리한 내용입니다.
다소 잘못된 내용과 구어적 표현 이 포함되어 있을 수 있습니다.
딕셔너리는 해시 테이블을 이용하는 자료형이다
- 숫자 뿐만 아니라 문자열, 튜플 등의 다양한 불변 객체를 키로 받을 수 있다. 이 과정을 해싱 이라고 한다.
- 그리고 이런 키마다 각각의 벨류를 연결하는 해시 테이블의 형태로 구성된다. 이 벨류들은 키를 통해서만 접근이 가능하다
- 해시 테이블의 장점은 다양한 자료형을 지원하면서도 연산의 속도가 아주 빠르다는 장점 이 있다. 파이썬 딕셔너리의 대부분 연산은 O(1)의 짧은 연산속도를 가진다
선언
dct = {"key1":"value1", "key2":"value2"}
키:벨류
쌍들이{}
속에 담겨있는 형태이다.- 딕셔너리의 키값은 변하면 안되기 때문에 불변객체로 선언해줘야 한다.
- 리스트를 키로 주면 안된다 이말이다
- 딕셔너리는 하나의 키에 하나의 벨류를 갖는다.
- 따라서 동일한 키를 갖는 두 벨류를 넣게되면 하나는 사라지게 된다.
- 그럼 여러개를 하나의 키로 묶고싶으면 리스트나 튜플을 이용하면 된다.
생성자
a = dict([(a, 1), (b, 2), (c, 3)])
a = dict(a=1, b=2, c=3)
[(), ()]
형태의 튜플 리스트를 인자로 받아 딕셔너리로 만들거나키=벨류
쌍을 여러개 입력해서 딕셔너리로 만들 수도 있다
접근
dct["key1"]
dct.get("key1")
- 인덱스로 접근하는게 아닌 키를 이용해 벨류를 접근한다. 따라서 인덱스 대신 키값을 대괄호
[]
에 넣어주면 벨류값에 접근할 수 있다. get
함수는[]
접근과 동일하나 키값이 존재하지 않는 경우 오류가 아닌None
객체를 반환한다- O(1)이다
키:벨류 쌍 추가하기
dct["key"] = "value"
- 이미 존재하는 key라면 해당하는 value가 바뀌겠지만 존재하지 않는다면 저
키:벨류
쌍을 새로 추가한다 - O(1)이다
키:벨류 쌍 삭제
del dct["key"]
- 딕셔너리는
del
말고는 다른 삭제방법이 없다
키들만 모아서 리스트로
dct.keys()
- 딕셔너리의 키들만 모아서 리스트로 반환한다
- 정확히는 리스트가 아닌 제네레이터로 반환한다
- 리스트로 쓰고싶으면
list()
를 이용하자
- 리스트로 쓰고싶으면
벨류만 모아서 리스트로
dct.values()
- 딕셔너리의 벨류들만 모아서 리스트로 반환한다
- 정확히는 리스트가 아닌 제네레이터로 반환한다
- 리스트로 쓰고싶으면
list()
를 이용하자
- 리스트로 쓰고싶으면
(키, 벨류)튜플 리스트로 바꾸기
dct.items()
- 딕셔너리의 키와 벨류를 튜플로 묶어서 리스트로 반환한다
- 정확히는 리스트가 아닌 제네레이터로 반환한다
- 리스트로 쓰고싶으면
list()
를 이용하자
- 리스트로 쓰고싶으면
키:벨류 쌍의 갯수 구하기
len(dct)
- 딕셔너리의
키:벨류
쌍의 갯수를 리턴한다 - O(1)이다
키가 존재하는지 알아내기
"key" in dct
- 키가 딕셔너리에 이미 존재하는지를 boolean 객체로 반환한다
- 이것도 O(1)이다
키:벨류 쌍 모두 지우기
dct.clear()
- 딕셔너리 내의 모든
키:벨류
쌍이 삭제된다
입력순서가 유지되는 딕셔너리
a = collections.ordereddict()
- 딕셔너리는 원래 입력 순서가 유지 안되다가 최근 파이썬 업데이트로 인해 입력순서가 유지되는것으로 바뀌었다
- 하지만 이전버전과의 호환성을 위해 입력순서 유지가 필요하면
collections
모듈의ordereddict()
클래스를 활용하자- type 이
dict
는 아니다.ordereddict
라는 wrapping된 딕셔너리 객체이다
- type 이
초기화를 자동으로 해주는 딕셔너리
a = collections.defaultdict(type)
“abc”
라는 키가 존재하지 않을 때dct[“abc”] + 2
연산을 하면 존재하지 않는 키에 접근하므로 오류가 난다- 하지만 이렇게 키가 존재하지 않을 때 자동으로
키:벨류
를 생성하고 초기화해 연산을 가능하게 해주는게collections
모듈의defaultdict
객체이다 dct = defaultdict(int)
로 선언하고 위의 연산을 해주면“abc”
의 벨류로 자동으로 0 이 초기화되고 2가 더해져“abc”:2
의 쌍이 추가된다- 괄호 안에 자료형을 꼭 명시해야 된다. 어떤 자료형으로 초기화할껀지 알아야 하기 때문이다
- 이것도 순수한 딕셔너리는 아닌 wrapping된 딕셔너리 객체로 나오게 된다
리스트나 튜플의 중복인자 세기
a = collections.counter(list/tuple)
a.most_common(3)
[1, 1, 3, 3, 3, 3, 5, 5, 5, 5, 5, 5]
라는 리스트를counter
객체로 만들면{1:2, 3:4, 5:6}
로 바꿔준다- 즉, 동일한 인자가 몇개있는지를 세어서 인자를 키로, 갯수를 벨류로 하는 딕셔너리로 반환한다
most_common(숫자)
은 가장 자주 등장하는 인자를’숫자’
순위까지만 튜플 리스트로 반환한다- 이것도 순수한 딕셔너리는 아닌 wrapping된 딕셔너리 객체로 나오게 된다