본문 바로가기

프로그래머/Python

[Python] 딕셔너리(dictionary) | Ordereddict(), defaultdict(), Counter()

출처: 파이썬 알고리즘 인터뷰, 박상길

  • 파이썬의 딕셔너리는 키/값 구조로 이루어진 딕셔너리를 말한다
  • 내부적으로는 해시 테이블로 구현되어 있다.

딕셔너리의 주요 연산 시간 복잡도

  • len(a) : O(1)

  • a[key] : O(1)

  • a[key] = value : O(1)

  • key in a : O(1)

  • 파이썬 3.6 이하에서는 입력 순서가 유지되지 않다 collections.OrderedDict()를 제공했다.

  • 파이썬 3.7부터는 내부적으로 인덱스를 이용해 입력 순서를 유지하도록 개선돼었다.

collections.defaultdict()

  • 조회 시 항상 디폴트 값을 생성해 키 오류를 방지한다.
from collections import defaultdict 

def def_value(): 
    return "Not Present"

# Defining the dict 
d = defaultdict(def_value) 
d["a"] = 1
d["b"] = 2

print(d["a"])   # 1
print(d["b"])   # 2
print(d["c"])   # Not Present
d = defaultdict(lambda: "Not Present") 
d["a"] = 1
d["b"] = 2

print(d["a"])     # 1
print(d["b"])     # 2
print(d["c"])     # Not Present
d = deflaultdict(int) 
d["a"] = 5
d["b"] = 4
d["c"] += 1
  • "c"와 같이 존재하지 않는 키에도 KeyError가 발생하지 않고 바로 연산이 간으하다
  • 디폴트인 0을 기준으로 자동을오 생성한 후 여기에 1을 더해 최종적으로 1이 만들어진다.

collections.Counter()

  • 요소의 값을 키로 하고 개수를 값 형태로 만들어 카운팅한다.
from collections import Counter 

# With sequence of items  
print(Counter(['B','B','A','B','C','A','B','B','A','C'])) 
# Counter({'B': 5, 'A': 3, 'C': 2})

# with dictionary 
print(Counter({'A':3, 'B':5, 'C':2})) 
# Counter({'B': 5, 'A': 3, 'C': 2})

# with keyword arguments 
print(Counter(A=3, B=5, C=2)) 
# Counter({'B': 5, 'A': 3, 'C': 2})
from collections import Counter 
coun = Counter() 

coun.update([1, 2, 3, 1, 2, 1, 1, 2]) 
print(coun) 
# Counter({1: 4, 2: 3, 3: 1})

coun.update([1, 2, 4]) 
print(coun) 
# Counter({1: 5, 2: 4, 3: 1, 4: 1})
coun.most_common(2)        # [(1, 5), (2, 4)]
  • 가장 빈도 수가 높은 요소 추출