본문 바로가기
Programming/Python

파이썬 collections 컨테이너형 자료 모듈

by 코딩하는 금융인 2021. 6. 13.

목차


오늘은 기업 코딩테스트나 여러 알고리즘 시험에서 자주 나오는 모듈인 파이썬의 collections에 대해 알아보겠습니다.

자료구조 문제에서 효율성 테스트를 통과하기 위해서는 collections를 통해 객체 등록해야 한다라는 말이 있을 정도로 데이터 전처리나 효율적 자료 구조 설정에서 많이 활용되므로 제대로 공부해보겠습니다.

Collection 설명

파이썬의 collections 모듈은 파이썬에 내장된 일반 자료형의(dict, list, set, tuple) 컨테이너 타입을 조금 더 발전시킨 형태의 구현체이다. 파이썬 2.7 까지는 네임드튜플, 디큐, 카운터, 순서형 딕셔너리, 기본 딕셔너리의 다섯 개의 컨테이너를 구현하고 있었으나 파이썬 3부터는 체인맵, 유저 딕셔너리, 유저 리스트, 유저 스트링 등의 자료구조가 추가되었다. collections 모듈에는 데이터 전처리를 위한 유용한 객체가 많이 있어 알아두면 잘 사용할 수 있다.

 

Collections 모듈

1. Counter

Counter은 dict의 subclass로써 새로운 인스턴스를 만드는 class, dict 내 아이템의 발생빈도를 카운트하여 저장한다.

실제 key 값들에 연속된 상황의 확인이 필요할 경우에 주로 사용

 

- 사용 예시

import collections
scores = ['A', 'B', 'B', 'C', 'C', 'D', 'A']
counter = collections.Counter(scores)
print(counter)
Counter({'A': 2, 'B': 2, 'C': 2, 'D': 1})

 

- 계산 연산자

연산자 설명
-= 뺀다. 결과가 음수면 그 요소는 삭제된다.
&= 좌변의 Counter 객체 요소 중 우변의 Counter 객체 요소에 미포함되어 있는 key의 요소를 삭제한다. 요소의 값은 둘 중 작은 쪽의 값이 된다.
l= 2개의 Counter 객체 전체의 요소로부터 새롭게 Counter 객체를 생성한다.
key가 같으면 두 값 중 큰 쪽의 값이 된다.

 

- 메소드

메소드(method) 설명
update() Counter의 값 갱신
counter나 문자열 형식 가능
elements() 값의 요소 반환 (무작위 순서)
most_common(n) 빈도수가 높은 순으로 tuple 형태로 반환
subtract() 해당하는 요소를 빼주며 0보다 작을 시 음수
import collections
scores = ['A', 'B', 'B', 'C', 'C', 'D', 'A']
counter = collections.Counter(scores)
print(counter)

# update()
score2 = ['C','D']
counter.update(score2)
print(counter)

## 결과 ##
Counter({'A': 2, 'B': 2, 'C': 2, 'D': 1})
Counter({'C': 3, 'A': 2, 'B': 2, 'D': 2})

# elements()
list(counter.elements())

## 결과 ##
['A', 'A', 'B', 'B', 'C', 'C', 'C', 'D', 'D']

# most_common()
counter.most_common(2)

## 결과 ##
[('C', 3), ('A', 2)]

# subtract()
counter.subtract(score2)
print(counter)

## 결과 ##
Counter({'A': 2, 'B': 2, 'C': 2, 'D': 1})

 

2. ChainMap

ChainMap은 여러 딕셔너리 객체를 하나로 모아 통합시켜준다. 통합된 객체에 변화가 발생할 경우, 딕셔너리에도 그 영향이 반영된다.

 

- 예시

score1 = {'A' : 3, 'B' : 5}
score2 = {'C' : 4, 'D' : 1}
counter = collections.ChainMap(score1,score2)

## 결과 ##
ChainMap({'A': 3, 'B': 5}, {'C': 4, 'D': 1})

 

3. defaultdict

딕셔너리 key 값이 미등록됐을 때 KeyError가 발생하는 단점을 보완한 객체이며 새로운 인스턴스를 만드는 데 적합.

 

- 예시

# 디폴트 값 선택 가능
e1 = collections.defaultdict(int)
e2 = collections.defaultdict(dict)
e3 = collections.defaultdict(list)
e4 = collections.defaultdict(set)

# default 생성
def get_default_value():
    return 'default-value'

# 여기서 get_default_value와 같은 callable 객체나 None을 입력할 수 있다.
# None을 입력할 경우 일반 사전과 마찬가지로 KeyError가 발생한다.

counter = collections.defaultdict(get_default_value, score = 'a')
print(counter['scores'])

## 결과 ##
default-value

 

4. OrderedDict

순서(시퀀스)를 유지하기 위해 linked list가 내부에 구성되어 각 순서가 유지되는 딕셔너리 (순서 유지)

 

- 예시

# 순서가 있는 사전
scores = collections.OrderedDict([('h',88), ('s', 97), ('a', 87)])
scores.popitem(last = True) # 마지막 순서 pop / last = False 시 첫번째 순서 pop
## 결과 ##
('a', 87)

scores.move_to_end(key = "h", last = True) # 마지막으로 key : value 옮기기 / last = False 시 첫번쨰로 옮기기
## 결과 ##
OrderedDict([('s', 97), ('h', 88)])

 

5. namedtuple

Index를 기준으로 접근하는 Tuple에 Key(name)를 가지고 접근할 수 있도록 지원해줌. (tuple의 확장 타입)

 

- 예시

# name 데이터 관리
score = collections.namedtuple("score", "A, B, C")
data = score(90, 70, 50)
print(data.B)

## 결과 ##
70

파이썬의 대표적인 자료구조 모듈 Collections에는 앞서 소개한 함수보다 더 많고 다양한 기능들을 가지고 있어,

시간날 때 깊게 탐구해보시는 것을 추천드리며 글을 마치겠습니다. 감사합니다!

 

References

 

 

 

 

반응형

댓글