okpy

Pythonエンジニア兼テックリーダーが、多くのプロジェクトとチーム運営から得た実践的な知識を共有するブログです。

Data Structures in Python: Harnessing the Power of Collections

Python collections ライブラリ完全ガイド

Python 標準ライブラリの collections は、リストや辞書を拡張した高度なデータ構造を提供する強力なツールです。本記事では、collections の主要なコンポーネントとその実践的な使用例を詳しく解説します。

1. collections ライブラリの概要

  • collections は、Python の基本的なデータ構造(リスト、辞書、タプル)を拡張した特殊なデータ型を提供します。
  • データの整理や効率的な操作が可能になり、特に辞書の拡張機能が便利です。
  • 主なコンポーネントには Counter, defaultdict, OrderedDict, deque, namedtuple などがあります。

インストール方法

collectionsPython の標準ライブラリなので、追加のインストールは不要です。

import collections

2. 主な機能と使用例

(1) 要素の出現回数をカウント(Counter

import collections

text = "banana apple banana orange apple banana"
word_count = collections.Counter(text.split())
print(word_count)

使用例: テキストデータの単語頻度分析や、リスト内の要素の出現回数を数える際に利用できます。


(2) デフォルト値を持つ辞書(defaultdict

import collections

default_dict = collections.defaultdict(int)

words = ["apple", "banana", "apple", "orange", "banana", "apple"]
for word in words:
    default_dict[word] += 1

print(default_dict)

使用例: キーが存在しない場合にデフォルト値を設定できるため、辞書の初期化を省略できます。


(3) 順序を保持する辞書(OrderedDict

import collections

ordered_dict = collections.OrderedDict()
ordered_dict["banana"] = 3
ordered_dict["apple"] = 2
ordered_dict["orange"] = 1

print(ordered_dict)

使用例: キーの順序が重要な場合に活用されます。Python 3.7 以降では通常の dict も順序を保持しますが、互換性を考慮して使用することがあります。


(4) 両端からの操作が可能なリスト(deque

import collections

deque_list = collections.deque(["apple", "banana", "orange"])
deque_list.append("grape")  # 末尾に追加
deque_list.appendleft("cherry")  # 先頭に追加
print(deque_list)

# 先頭と末尾の要素を削除
deque_list.pop()
deque_list.popleft()
print(deque_list)

使用例: 高速なキューやスタックを実装する際に利用できます。


(5) 名前付きタプル(namedtuple

import collections

Person = collections.namedtuple("Person", ["name", "age", "city"])
user = Person("Alice", 25, "Tokyo")
print(user.name, user.age, user.city)

使用例: 辞書のようにキーを指定しつつ、タプルのように変更不可なデータ構造を作成できます。


(6) 双方向辞書(ChainMap

import collections

dict1 = {"name": "Alice", "age": 25}
dict2 = {"city": "Tokyo", "country": "Japan"}

combined = collections.ChainMap(dict1, dict2)
print(combined["name"], combined["city"])  # Alice Tokyo

使用例: 複数の辞書を統合し、一元的にアクセスする際に利用できます。


(7) ミュータブルな名前付きタプル(NamedTuple

from collections import namedtuple

Person = namedtuple("Person", ["name", "age", "city"])
p = Person("Bob", 30, "Osaka")
print(p.name, p.age, p.city)  # Bob 30 Osaka

使用例: 可読性が高く、フィールド名でアクセス可能なデータ構造を作成できます。


(8) リストを辞書にグループ化(defaultdict

import collections

data = [("fruit", "apple"), ("fruit", "banana"), ("veg", "carrot")]
grouped = collections.defaultdict(list)

for key, value in data:
    grouped[key].append(value)

print(grouped)  # {'fruit': ['apple', 'banana'], 'veg': ['carrot']}

使用例: カテゴリ別にデータを整理する際に便利です。


(9) deque を使用したスタック(LIFO

import collections

stack = collections.deque()
stack.append("task1")
stack.append("task2")
print(stack.pop())  # task2

使用例: 後入れ先出し(LIFO)のデータ構造として利用できます。


(10) deque を使用したキュー(FIFO

import collections

queue = collections.deque()
queue.append("task1")
queue.append("task2")
print(queue.popleft())  # task1

使用例: 先入れ先出しFIFO)のデータ構造として利用できます。


3. collections の便利なデータ構造

データ構造 説明
Counter 要素の出現回数をカウントする
defaultdict デフォルト値を持つ辞書
OrderedDict 順序を保持する辞書
deque 両端から操作できるリスト
namedtuple 名前付きタプル

まとめ

Pythoncollections ライブラリは、より効率的なデータ管理を可能にする強力なツールです。リストや辞書の拡張機能を活用し、コードの可読性とパフォーマンスを向上させましょう! 🚀