위키북스 박응용 저 "점프 투 파이썬" 책을 읽고 정리한 내용입니다.

다소 잘못된 내용과 구어적 표현 이 포함되어 있을 수 있습니다.

딕셔너리는 해시 테이블을 이용하는 자료형이다

  • 숫자 뿐만 아니라 문자열, 튜플 등의 다양한 불변 객체를 키로 받을 수 있다. 이 과정을 해싱 이라고 한다.
  • 그리고 이런 키마다 각각의 벨류를 연결하는 해시 테이블의 형태로 구성된다. 이 벨류들은 키를 통해서만 접근이 가능하다
  • 해시 테이블의 장점은 다양한 자료형을 지원하면서도 연산의 속도가 아주 빠르다는 장점 이 있다. 파이썬 딕셔너리의 대부분 연산은 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된 딕셔너리 객체이다

초기화를 자동으로 해주는 딕셔너리

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된 딕셔너리 객체로 나오게 된다