파이썬 Collections 라이브러리

뚜시뚜시·2020년 4월 16일
2
post-custom-banner

주요 메서드


collections - Container datatypes - Python 3.8.2 documentation

사용방법


import collections
import collections.namedtuple as coltuple

namedtuple


일반적인 튜플의 경우 숫자인덱스가 있지만 namedtuple의 경우 키가 있기 때문에, 각각의 튜플값에 이름(키)를 부여할 수 있다.

import collections

Person = collections.namedtuple('Person', 'name age gender')

print ('Type of Person:', type(Person))

bob = Person(name='Bob', age=30, gender='male')
print ('\nRepresentation:', bob)

jane = Person(name='Jane', age=29, gender='female')
print ('\nField by name:', jane.name)

print ('\nFields by index:')
for p in [ bob, jane ]:
    print ('%s is a %d year old %s' % p)

Result

Type of Person: <class 'type'>

Representation: Person(name='Bob', age=30, gender='male')

Field by name: Jane

Fields by index:
Bob is a 30 year old male
Jane is a 29 year old female

실제로 bob의 저장을 보면 다음과 같다.

타입은 역시나 tuple로 되어있다.

OrderedDict


dict구조에 순서를 부여한 선형구조를 갖게 만든다. dict에 linked list로 내부에 구성되어 각 순서를 유지한다.

import collections

# 기본 dict구조
print('Regular dictionary:')
d = {}
d['a'] = 'A'
d['b'] = 'B'
d['c'] = 'C'

for k, v in d.items():
    print(k, v)

    
# 링크드리스트로 구현된 순서가 있는 dict구조
print('\nOrderedDict:')
d = collections.OrderedDict()
d['a'] = 'A'
d['b'] = 'B'
d['c'] = 'C'

for k, v in d.items():
    print(k, v)

Result

Regular dictionary:
a A
b B
c C

OrderedDict:
a A
b B
c C

그렇다면 해시테이블 구조에도 적용할 수 있을까? 해시테이블에서 해시코드를 각 인덱스에 부여해 줄때, 중복 인덱스여도 링크드 리스트로 연결되어 있기 때문에 처리를 해줄 수 있다.

# 중복 dict 입력
d = collections.OrderedDict()
d['a'] = 'A'
d['b'] = 'B'
d['c'] = 'C'
d['a'] = 'D'
d['a'] = 'E'

print(d)

OrderedDict([('a', 'E'), ('b', 'B'), ('c', 'C')])

안되나 보다. 그만 알아보자.

Counter

개수를 세는데 특화된 클래스이다.

import collections
 
myList = ['a', 'b', 'c', 'c', 'a', 'a']
myCounter = collections.Counter(myList)
print('myCounter:', myCounter)
# myCounter: Counter({'a': 3, 'c': 2, 'b': 1})
 
print("myCounter['a']:", myCounter['a'])
# myCounter['a']: 3
 
yourList = ['a', 'd', 'c', 'a', 'b']
yourCounter = collections.Counter(yourList)
print('yourCounter:', yourCounter)
# yourCounter: Counter({'a': 2, 'd': 1, 'b': 1, 'c': 1})
 
ourCounter = myCounter + yourCounter
print('ourCounter:', ourCounter)
# ourCounter: Counter({'a': 5, 'c': 3, 'b': 2, 'd': 1})
 
print('ourCounter.most_common(3):', ourCounter.most_common(3))
# ourCounter.most_common(3): [('a', 5), ('c', 3), ('b', 2)]

각각 키에대해서 얼마나 사용됬는지를 카운트해준다.

Deque

자료구조에서 배운 queue가 양방향으로 작동할 때를 deque라고 한다.

# -*- coding:utf-8 -*-
import collections
 
d = collections.deque([10, 20, 30, 40, 50])
print('Deque: ', d)
# 'Deque: ', deque([10, 20, 30, 40, 50])
 
# 오른쪽에 추가
d.append(60)
print('Deque: ', d)
# 'Deque: ', deque([10, 20, 30, 40, 50, 60])
 
# 왼쪽에 추가
d.appendleft(0)
print('Deque: ', d)
# 'Deque: ', deque([0, 10, 20, 30, 40, 50, 60])
 
# 입력값을 순환하면서 오른쪽에 추가(append)
d.extend([70, 80])
print('Deque: ', d)
# 'Deque: ', deque([0, 10, 20, 30, 40, 50, 60, 70, 80])
 
# 입력값을 순환하면서 왼쪽에 추가(appendleft)
d.extendleft([-10, -20, -30])
print('Deque: ', d)
# 'Deque: ', deque([-30, -20, -10, 0, 10, 20, 30, 40, 50, 60, 70, 80])
 
# 값 삭제
d.remove(0)
print('Deque: ', d)
# 'Deque: ', deque([-30, -20, -10, 10, 20, 30, 40, 50, 60, 70, 80])
 
# 오른쪽의 끝값 가져오면서 deque에서 제거
maxValue = d.pop()
print('maxValue:', maxValue)
# maxValue: 80
print('Deque: ', d)
# Deque:  deque([-30, -20, -10, 10, 20, 30, 40, 50, 60, 70])
 
# 왼쪽의 끝값 가져오면서 deque에서 제거
minValue = d.popleft()
print('minValue:', minValue)
# minValue: -30
print('Deque: ', d)
# Deque:  deque([-20, -10, 10, 20, 30, 40, 50, 60, 70])
 
# 값 회전(rotating)
d = collections.deque(range(5))
print('Deque: ', d)
# Deque:  deque([0, 1, 2, 3, 4])
 
d.rotate(1)
print('Deque.rotate(1): ', d)
# Deque.rotate(1):  deque([4, 0, 1, 2, 3])
 
d.rotate(1)
print('Deque.rotate(1): ', d)
# Deque.rotate(1):  deque([3, 4, 0, 1, 2])
 
d.rotate(-1)
print('Deque.rotate(-1): ', d)
# Deque.rotate(-1):  deque([4, 0, 1, 2, 3])
 
d.rotate(-1)
print('Deque.rotate(-1): ', d)
# Deque.rotate(-1):  deque([0, 1, 2, 3, 4])

< 참고 >

파이썬 콜렉션 모듈(python collections)

profile
ddusi ddusi
post-custom-banner

0개의 댓글