Akashic Records

3.5 컬렉션 모듈 본문

Python for Beginners

3.5 컬렉션 모듈

Andrew's Akashic Records 2023. 3. 17. 13:23
728x90

파이썬의 컬렉션 모듈은 다양한 고급 컨테이너 유형을 제공합니다. 

이 모듈에는 namedtuple, deque, Counter, OrderedDict, defaultdict, ChainMap, UserDict, UserList, UserString 등이 포함되어 있습니다. 여기서는 가장 자주 사용되는 컨테이너 유형에 대한 설명과 예시 코드를 제공하겠습니다.

 

namedtuple: 튜플의 서브 클래스로, 필드 이름이 있는 튜플을 만듭니다. 이를 통해 코드를 더 명확하게 만들 수 있습니다.

 

예시 코드 1 - namedtuple:

from collections import namedtuple

# namedtuple 정의
Person = namedtuple("Person", ["name", "age", "gender"])

# namedtuple 인스턴스 생성
person = Person("John", 30, "male")

print(person)  # 출력: Person(name='John', age=30, gender='male')
print(person.name)  # 출력: John
print(person.age)  # 출력: 30
print(person.gender)  # 출력: male

 

deque: 양쪽 끝에서 빠르게 추가 및 제거를 할 수 있는 스택과 큐를 일반화한 형태의 자료구조입니다.

 

예시 코드 2 - deque:

from collections import deque

# deque 생성
my_deque = deque([1, 2, 3, 4])

# deque에 요소 추가
my_deque.append(5)  # 오른쪽에 추가
my_deque.appendleft(0)  # 왼쪽에 추가
print(my_deque)  # 출력: deque([0, 1, 2, 3, 4, 5])

# deque에서 요소 제거
my_deque.pop()  # 오른쪽 요소 제거
my_deque.popleft()  # 왼쪽 요소 제거
print(my_deque)  # 출력: deque([1, 2, 3, 4])

 

Counter: 컨테이너에서 요소의 개수를 세는 데 사용하는 딕셔너리 서브 클래스입니다.

 

예시 코드 3 - Counter:

from collections import Counter

# 문자열에서 문자 개수 세기
char_count = Counter("hello world")
print(char_count)  # 출력: Counter({'l': 3, 'o': 2, 'h': 1, 'e': 1, ' ': 1, 'w': 1, 'r': 1, 'd': 1})

# 리스트에서 요소 개수 세기
elem_count = Counter([1, 2, 3, 2, 1, 3, 1, 1, 3, 3, 3])
print(elem_count)  # 출력: Counter({3: 5, 1: 4, 2: 2})

 

OrderedDict: 삽입 순서를 기억하는 딕셔너리 서브 클래스입니다. 파이썬 3.7 이후로 일반 딕셔너리도 삽입 순서를 기억하기 때문에, 이제는 거의 사용되지 않습니다. 그러나, 명시적으로 삽입 순서를 보장하려는 경우 사용할 수 있습니다.


예시 코드 4 - OrderedDict:

from collections import OrderedDict

# OrderedDict 생성
ordered_dict = OrderedDict()

ordered_dict["first"] = 1
ordered_dict["second"] = 2
ordered_dict["third"] = 3

for key, value in ordered_dict.items():
    print(key, value)
# 출력:
# first 1
# second 2
# third 3

 

defaultdict: 딕셔너리 서브 클래스로, 요청한 키를 찾을 수 없는 경우 자동으로 기본값을 할당합니다.

 

예시 코드 5 - defaultdict:

from collections import defaultdict

# 기본값으로 int (0)를 사용하는 defaultdict 생성
default_dict = defaultdict(int)

# 키 값이 없는 경우 기본값을 할당
default_dict["one"] += 1
default_dict["two"] += 2

print(default_dict)  # 출력: defaultdict(<class 'int'>, {'one': 1, 'two': 2})

 

ChainMap: 여러 개의 딕셔너리를 하나의 매핑으로 그룹화합니다. 이렇게 하면 여러 딕셔너리를 차례대로 검색할 수 있습니다.


예시 코드 6 - ChainMap:

from collections import ChainMap

dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}

chain_map = ChainMap(dict1, dict2)

print(chain_map)  # 출력: ChainMap({'a': 1, 'b': 2}, {'b': 3, 'c': 4})
print(chain_map['a'])  # 출력: 1
print(chain_map['b'])  # 출력: 2 (첫 번째 딕셔너리의 값이 먼저 반환됩니다)
print(chain_map['c'])  # 출력: 4

 

UserDict, UserList, UserString: 각각 딕셔너리, 리스트, 문자열의 사용자 정의 서브 클래스를 쉽게 만들 수 있게 하는 래퍼 클래스입니다. 이들은 내장 자료형을 상속받는 것보다 사용자 정의 서브 클래스를 작성하는 데 더 적합합니다.

 

예시 코드 7 - UserDict:

from collections import UserDict

class MyDict(UserDict):
    def __missing__(self, key):
        return f"{key} not found"

my_dict = MyDict({'a': 1, 'b': 2})
print(my_dict['a'])  # 출력: 1
print(my_dict['c'])  # 출력: c not found (기본 딕셔너리와 달리 custom 메서드 사용)

 

컬렉션 모듈은 다양한 고급 컨테이너 유형을 제공하여 프로그래머가 적절한 도구를 선택하여 데이터를 조직하고 작업을 수행할 수 있습니다. 이러한 컨테이너는 일반적인 자료형을 확장하거나 래핑하여 추가적인 기능을 제공합니다. 이를 통해 코드를 더 효율적이고 간결하게 작성할 수 있습니다.

728x90

'Python for Beginners' 카테고리의 다른 글

4.2 파일 쓰기(open 함수)  (0) 2023.03.20
4.1 파일 읽기(open 함수)  (0) 2023.03.20
3.4 집합  (0) 2023.03.17
3.3 딕셔너리  (0) 2023.03.17
3.2 튜플  (0) 2023.03.17
Comments