collections 모듈 간략 소개

Beginner

This tutorial is from open-source community. Access the source code

소개

collections 모듈은 데이터 처리에 유용한 여러 객체를 제공합니다. 이 부분에서는 이러한 기능 중 일부를 간략하게 소개합니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 중급 레벨의 실험이며 완료율은 73%입니다.학습자들로부터 100%의 긍정적인 리뷰율을 받았습니다.

예시: 항목 개수 세기

각 주식의 총 주식 수를 표로 만들고 싶다고 가정해 봅시다.

portfolio = [
    ('GOOG', 100, 490.1),
    ('IBM', 50, 91.1),
    ('CAT', 150, 83.44),
    ('IBM', 100, 45.23),
    ('GOOG', 75, 572.45),
    ('AA', 50, 23.15)
]

이 목록에는 두 개의 IBM 항목과 두 개의 GOOG 항목이 있습니다. 주식 수를 어떻게든 합쳐야 합니다.

Counter (카운터)

해결책: Counter를 사용합니다.

from collections import Counter
total_shares = Counter()
for name, shares, price in portfolio:
    total_shares[name] += shares

total_shares['IBM']     ## 150

예시: 일대다 매핑 (One-Many Mappings)

문제: 키를 여러 값에 매핑하고 싶습니다.

portfolio = [
    ('GOOG', 100, 490.1),
    ('IBM', 50, 91.1),
    ('CAT', 150, 83.44),
    ('IBM', 100, 45.23),
    ('GOOG', 75, 572.45),
    ('AA', 50, 23.15)
]

이전 예제와 마찬가지로, 키 IBM은 대신 두 개의 서로 다른 튜플을 가져야 합니다.

해결책: defaultdict를 사용합니다.

from collections import defaultdict
holdings = defaultdict(list)
for name, shares, price in portfolio:
    holdings[name].append((shares, price))
holdings['IBM'] ## [ (50, 91.1), (100, 45.23) ]

defaultdict는 키에 접근할 때마다 기본값을 얻도록 보장합니다.

예시: 기록 유지 (Keeping a History)

문제: 마지막 N 개의 항목에 대한 기록을 원합니다. 해결책: deque를 사용합니다.

from collections import deque

history = deque(maxlen=N)
with open(filename) as f:
    for line in f:
        history.append(line)
        ...

collections 모듈은 표 작성 및 인덱싱과 같은 특수 목적의 데이터 처리 문제를 다루는 데 가장 유용한 라이브러리 모듈 중 하나일 수 있습니다.

이 연습에서는 몇 가지 간단한 예제를 살펴보겠습니다. 대화형 모드에서 주식 포트폴리오가 로드되도록 report.py 프로그램을 실행하여 시작합니다.

$ python3 -i report.py

연습 문제 2.18: Counter 를 사용한 표 작성 (Tabulating with Counters)

각 주식의 총 주식 수를 표로 만들고 싶다고 가정해 봅시다. Counter 객체를 사용하면 쉽습니다. 시도해 보세요:

>>> portfolio = read_portfolio('portfolio.csv')
>>> from collections import Counter
>>> holdings = Counter()
>>> for s in portfolio:
        holdings[s['name']] += s['shares']

>>> holdings
Counter({'MSFT': 250, 'IBM': 150, 'CAT': 150, 'AA': 100, 'GE': 95})
>>>

portfolio에서 MSFTIBM에 대한 여러 항목이 어떻게 여기에 단일 항목으로 결합되는지 주의 깊게 살펴보세요.

개별 값을 검색하기 위해 Counter 를 사전처럼 사용할 수 있습니다:

>>> holdings['IBM']
150
>>> holdings['MSFT']
250
>>>

값을 순위별로 정렬하려면 다음과 같이 하세요:

>>> ## Get three most held stocks
>>> holdings.most_common(3)
[('MSFT', 250), ('IBM', 150), ('CAT', 150)]
>>>

다른 주식 포트폴리오를 가져와서 새로운 Counter 를 만들어 봅시다:

>>> portfolio2 = read_portfolio('portfolio2.csv')
>>> holdings2 = Counter()
>>> for s in portfolio2:
          holdings2[s['name']] += s['shares']

>>> holdings2
Counter({'HPQ': 250, 'GE': 125, 'AA': 50, 'MSFT': 25})
>>>

마지막으로, 간단한 연산을 수행하여 모든 보유 주식을 결합해 봅시다:

>>> holdings
Counter({'MSFT': 250, 'IBM': 150, 'CAT': 150, 'AA': 100, 'GE': 95})
>>> holdings2
Counter({'HPQ': 250, 'GE': 125, 'AA': 50, 'MSFT': 25})
>>> combined = holdings + holdings2
>>> combined
Counter({'MSFT': 275, 'HPQ': 250, 'GE': 220, 'AA': 150, 'IBM': 150, 'CAT': 150})
>>>

이것은 Counter 가 제공하는 기능의 작은 맛보기일 뿐입니다. 하지만 값을 표로 만들어야 할 경우, Counter 사용을 고려해야 합니다.

해설: collections 모듈

collections 모듈은 Python 전체에서 가장 유용한 라이브러리 모듈 중 하나입니다. 사실, 이에 대한 확장된 튜토리얼을 진행할 수도 있습니다. 하지만 지금 그렇게 하는 것은 또한 주의를 산만하게 할 것입니다. 지금은 collections를 나중에 읽을 취침 전 독서 목록에 추가해 두세요.

요약

축하합니다! Collections Module 랩을 완료했습니다. LabEx 에서 더 많은 랩을 연습하여 기술을 향상시킬 수 있습니다.