파이썬의 "collections" 모듈은 다양하고 강력한 컨테이너 데이터형을 제공합니다.
오늘은 "collections" 모듈의 주요 컴포넌트들을 알아보고 어떻게 사용될 수 있는지 알아보겠습니다!
1. namedtuple
'namedtuple' 는 튜플을 생성하는 방법 중 하나로 간단한 데이터 구조를 표현하는데 사용됩니다. 'namedtuple'는 각 요소에 이름을 지정할 수 있는데 이는 코드의 가독성을 향상 시키고 데이터를 더 쉽게 다룰 수 있게 해줍니다.
from collections import namedtuple
Person = namedtuple('Person', ['name', 'age', 'gender'])
person1 = Person(name='Alice', age=30, gender='Female')
print(person1.name) # 'Alice'
print(person1.age) # 30
print(person1.gender) # 'Female'
- 가독성 : 필드에 이름이 지정되어 코드가 읽기 쉽고 이해하기 쉬워집니다.
- 불변성 : 튜플은 변경 불가능하므로 한 번 생성된 데이터 구조는 수정할 수 없습니다. 이는 데이터의 무결성을 유지하는데 도움이 됩니다.
- 튜플의 모든 기능 : 'namedtuple' 은 튜플의 모든 특성과 메서드를 상속받으므로 리스트처럼 요소에 접근할 수 있습니다.
2. deque (double-ended queue)
양쪽 끝에서 빠른 append 와 pop 작업이 가능한 리스트와 유사한 컨테이너 입니다. 보통 큐(queu)는 선입선출(FIFO) 방식으로 동작하는 것에 반하여 양방향 큐라는 것이 있는데 이것이 바로 deque입니다. (데큐, 디큐, 데크 다들 부르는 말이 다르네요..? 전 디큐로 알았는데)
deque 특징은 다음과 같습니다.
양방향성 : deque는 양쪽 끝에서 요소를 추가하거나 제거할 수 있습니다.
성능 : 리스트에 비해 양쪽 끝에서의 연산이 빠르며, 중간 요소에 접근할 때는 리스트보다 느릴 수 있습니다.
가변성 : 크기가 동적으로 변할 수 있으며, 메모리를 효율적으로 사용합니다.
인덱싱과 슬라이싱 지원 : 일반 리스트와 같이 인덱싱과 슬라이싱을 지원하지만, 중간 요소에 대한 작업은 상대적으로 느립니다.
주요 메소드에 대하여 소개하겠습니다!
메소드를 잘 보시면 기본이 오른쪽 left가 뒤에 붙으면 왼쪽에서 동작합니다.
append(x): deque의 오른쪽 끝에 새로운 요소 x를 추가합니다.
appendleft(x): deque의 왼쪽 끝에 새로운 요소 x를 추가합니다.
pop(): deque의 오른쪽 끝 요소를 제거하고 반환합니다.
popleft(): deque의 왼쪽 끝 요소를 제거하고 반환합니다.
extend(iterable): iterable의 모든 요소를 deque의 오른쪽 끝에 추가합니다.
extendleft(iterable): iterable의 모든 요소를 deque의 왼쪽 끝에 추가합니다. 주의할 점은 추가되는 요소들의 순서가 반대가 됩니다.
rotate(n): deque의 모든 요소를 n만큼 오른쪽으로 회전시킵니다 (양수일 경우). n이 음수이면 왼쪽으로 회전합니다.
clear(): deque의 모든 요소를 제거합니다.
count(x): deque 내에 있는 요소 x의 개수를 반환합니다.
index(x, [start, [stop]]): x 요소의 위치를 찾습니다. 선택적으로 start와 stop 범위를 지정할 수 있습니다.
insert(i, x): 지정된 위치 i에 요소 x를 삽입합니다.
remove(value): deque에서 처음으로 나타나는 value를 제거합니다.
reverse(): deque의 요소 순서를 뒤집습니다.
maxlen: deque가 생성될 때 설정된 최대 길이를 반환합니다. 최대 길이가 제한되지 않았다면 None을 반환합니다.
일부 메소드 예시입니다.
from collections import deque
d = deque([1, 2, 3])
d.append(4) # [1, 2, 3, 4]
d.appendleft(0) # [0, 1, 2, 3, 4]
d.pop() # [0, 1, 2, 3]
d.popleft() # [1, 2, 3]
3. Counter
요소들의 개수를 셀 때 사용되는 딕셔너리 서브 클래스입니다.
from collections import Counter
# 예시 1
c = Counter('hello world')
print(c) # 출력: Counter({'l': 3, 'o': 2, 'h': 1, ...})
# 예시 2
list1 = ['apple', 'banana', 'orange', 'kiwi']
list2 = ['banana', 'kiwi', 'lemon']
# 두 리스트의 Counter 객체 생성
counter1 = Counter(list1)
counter2 = Counter(list2)
# list1에만 있는 요소와 개수
only_in_list1 = counter1 - counter2
print(only_in_list1) # Counter({'apple': 1, 'orange': 1})
# list2에만 있는 요소와 개수
only_in_list2 = counter2 - counter1
print(only_in_list2) # Counter({'lemon': 1})
# 두 리스트에 공통으로 있는 요소와 최소 개수
common_elements = counter1 & counter2
print(common_elements) # Counter({'banana': 1, 'kiwi': 1})
Counter 객체 생성하여 추가적인 활용 예시
가장 많은 요소 찾기
count = Counter(my_list)
print(count.most_common(1)) # [('apple', 3)]
요소들의 총 개수
total = sum(count.values())
print(total) # 6
4. OrderedDict
요소들이 추가된 순서를 기억하는 딕셔너리의 서브클래스 입니다. 파이썬 3.7 부터는 일반 딕셔너리도 순서를 유지하지만
'OrderedDict'는 순서 관련 추가 기능을 제공합니다.
from collections import OrderedDict
d = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
for key in reversed(d):
print(key, d[key]) # 'c' 3, 'b' 2, 'a' 1
move_to_end : 지정된 키를 끝으로 옮깁니다.
d.move_to_end('b', last=False)
d # OrderedDict([('b', 2), ('a', 1), ('c', 3)])
popitem : 요소를 제거하고 반환 합니다.
'last' 파라미터가 'True'면 이전 해당 요소를 마지막 위치로 이동 시킵니다.
'last' 파라미터가 'False'면 이전 해당 요소를 맨앞으로 이동 시킵니다.
popitem(last=True) 마지막 요소를 제거하고 반환합니다. 이는 가장 최근에 추가된 요소입니다.
popitem(last=False) 첫번째 요소를 제거하고 반환합니다. 이는 가장 오래전에 추가된 요소입니다.
5. defaultdict
누락된 값에 기본 값을 제공하는 딕셔너리 클래스 입니다. 'defaultdict' 클래스는 기본 딕셔너리와 유사하지만 존재하지 않는 키에 대한 기본 값을 제공하는 추가적인 기능을 갖고 있습니다. 'defaultdict' 는 딕셔너리 생성할 때 기본 값을 생성하는 함수를 인자로 받습니다.
이 함수는 딕셔너리에 존재하지 않는 키에 접근할 때 호출 되어 기본값을 제공합니다.
1 ) 리스트를 기본 값으로 하는 defaultdict
from collections import defaultdict
# 리스트를 기본 값으로 가지는 defaultdict 생성
group = defaultdict(list)
# 데이터 추가
group['fruits'].append('apple')
group['fruits'].append('banana')
group['vegetables'].append('carrot')
print(group) # defaultdict(<class 'list'>, {'fruits': ['apple', 'banana'], 'vegetables': ['carrot']})
2 ) 정수를 값으로 하는 defaultdict
from collections import defaultdict
# 정수를 기본 값으로 가지는 defaultdict 생성
counts = defaultdict(int)
# 단어의 빈도수 계산
words = ["apple", "banana", "apple", "orange", "banana", "apple"]
for word in words:
counts[word] += 1
print(counts) # defaultdict(<class 'int'>, {'apple': 3, 'banana': 2, 'orange': 1})
3 ) 집합을 기본 값으로 하는 defaultdict
from collections import defaultdict
# 세트를 기본 값으로 가지는 defaultdict 생성
unique_items = defaultdict(set)
# 데이터 추가
unique_items['fruits'].add('apple')
unique_items['fruits'].add('banana')
unique_items['fruits'].add('apple') # 중복된 'apple'은 무시됨
print(unique_items) # defaultdict(<class 'set'>, {'fruits': {'banana', 'apple'}})
자 지금까지 collections 모듈의 다양한 메소드와 그 기능을 사용하는 예시들을 알아보았습니다!
참 알고 업무를 진행하면 더 효율적인 개발을 하고 간결하고 가독성이 좋은 코드를 작성 할 수 있을 것 같습니다!
긴글 읽어주셔서 감사합니다!
구독 구독~
'Python' 카테고리의 다른 글
Python Linter : 파이썬 린터 Pylint, Flake8, isort , black, Ruff (0) | 2023.12.28 |
---|---|
Poetry 2편 : Pyenv 와 Poetry로 가상환경 관리하기! (0) | 2023.12.08 |
poetry 1편 : poetry란? 의존성 관리하는 방법, 기본 사용법 및 설정 방법 (0) | 2023.12.07 |
pyenv 와 pipenv 를 사용한 python 가상환경 설정, 개발 환경 설정 (0) | 2022.01.18 |
vs code 와 docker를 사용한 컨테이너 개발 환경(Python) 구축 (0) | 2021.04.26 |