collections - Container datatypes - Python 3.8.2 documentation
import collections
import collections.namedtuple as coltuple
일반적인 튜플의 경우 숫자인덱스가 있지만 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로 되어있다.
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')])
안되나 보다. 그만 알아보자.
개수를 세는데 특화된 클래스이다.
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)]
각각 키에대해서 얼마나 사용됬는지를 카운트해준다.
자료구조에서 배운 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])
< 참고 >