반응형

파이썬에서 딕셔너리는 리스트와 더불어 가장많이 사용된다. 딕셔너리는 해시 테이블로 구현되어있어서 매우 빠르게 실행되며 시간복잡도는 O(1)이다. 딕셔너리 자료형을 잘 활용하도록 하자.

딕셔너리 생성

a = {'a': 1, 'b': 2, 'c': 3}
# {'a': 1, 'b': 2, 'c': 3}

딕셔너리 Key, Value 조회,수정,삭제

딕셔너리에서 Key를 조회하는 방법은 세가지가 존재한다.

a.keys()
# dict_keys(['a', 'b', 'c'])

a['a']
# 1

a.get('a')
# 1

첫번째 방법은 딕셔너리에 존재하는 전체 Key를 조회한다. 두번째 세번째 방법의 차이라고하면 존재하지 않는 Key를 조회하였을때 위의 방법은 Error를 발생하고 아래의 방법은 None을 리턴해준다. get() 함수를 통해 조회하고자 할때는 주의해야한다. Error를 발생시키지 않기때문에 버그를 일으킬 가능성이 매우 높다.

a['d']
# Traceback (most recent call last):
# File "<input>", line 1, in <module>
# KeyError: 'd'

a.get('d')
# None

딕셔너리에 존재하는 모든 Key, Value를 조회하고 싶으면 For문과 items() 함수를 통해 가능하다.


for k, v in a.items():
    print(f'key: {k} | value: {v}')
# key: a | value: 1
# key: b | value: 2
# key: c | value: 3

딕셔너리에 key, value를 추가, 수정하는 방법은 직접접근방법과 update()함수를 통해 가능하다.

# 직접접근
a['d'] = 4
# {'a': 1, 'b': 2, 'c': 3, 'd': 4}

# update함수
a.update('d')
# {'a': 1, 'b': 2, 'c': 3, 'd': 4}

딕셔너리에 특정 key를 제거하고 싶으면 del함수 또는 pop()을 통해 가능하다. pop()함수는 key를 제거함과 동시에 value값을 리턴해준다.

# del
del a['c']
# {'a': 1, 'b': 2}

# pop()
a.pop('c')
# 3 <- return value
# {'a': 1, 'b': 2}

defaultdict()

defaultdict()는 딕셔너리에 존재하지 않는 Key를 조회할경우 Error를 뿜는것 대신 해당 Key를 생성해준다. 이러한 특징 덕분에defaultdict()는 특정 상황에서 아주 유용하게 사용될 수 있다. 해당 자료형은 collections에서 접근할 수있다.

예를들어 딕셔너리에 새롭게 Key를 생성함과 동시에 value를 값을 더해준다던가, 리스트의 경우 append를 해줘야 한다던가 하는 상황이다.

다음과 같은 예시가 있다고 해보자.

a = collections.defaultdict(list) <- value에 대응되는 자료형을 받는다.
# defaultdict(<class 'list'>, {}) <- 빈 딕셔너리.

a['a'].append(['school', 'church'])
# {'a': ['school', 'church']}

a['b'].append(['sun', 'sea'])
# {'a': ['school', 'church'], 'b': ['sun', 'sea']}

OrderedDict()

파이썬 3.7부터는 딕셔너리의 순서가 보장되지만, 3.6이하에서는 순서가 보장되지 않는다. 예를들어 1,000개의 (Key, Value)쌍을 순차적으로 입력하였다고 하더라도 그 순서가 섞일 수 있다는 것이다. OrderedDict() 라는 자료형은 이러한것을 방지하기위해 존재한다. 해당 자료형은 collections에서 접근할 수있다.

a = {'c': 3, 'b': 2, 'a': 1, 'd': 4, 'z': 26, 't':20}
collections.OrderedDict(a)
# {'c': 3, 'b': 2, 'a': 1, 'd': 4, 'z': 26, 't':20} <- 순서보장

Counter

Counter 클래스는 갯수를 집계할때 매우 유용하다. 리스트의 값들의 갯수를 집계하여 딕셔너리 형태로 리턴해준다.

b = ['1', '1', '2', '2', '2', '3' ,'4', '4', '4', '4', '5', '5']
collections.Counter(b)
# Counter({'4': 4, '2': 3, '1': 2, '5': 2, '3': 1})
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기