Pythonのcollectionsモジュールは、様々なデータ型を定義するための便利なクラスを提供しています。
この記事では、collectionsモジュールの便利な関数であるdefaultdict、OrderedDict、Counter、deque、namedtupleについて紹介し、サンプルコードを交えて使い方を解説します。
collectionsモジュールって何ですか?
collectionsモジュールは、Pythonの標準ライブラリの一つで、データ型を拡張するためのクラスを提供するモジュールです。例えば、リストや辞書、セットなどの組み込みのコンテナ型の振る舞いを拡張するためのクラスが定義されています。
defaultdictの使い方:辞書におけるキーの存在確認を簡略化
Pythonのcollectionsモジュールに含まれるdefaultdictは、辞書のサブクラスで、存在しないキーにアクセスした場合に、指定されたデフォルト値を返すことができます。defaultdictを使うことで、コードがシンプルになり、実装の手間を省くことができます。
例えば、リストを値の初期値として指定してdefaultdictを作成すると、存在しないキーにアクセスしてもエラーが発生しません。以下は、defaultdictを使った例です。
from collections import defaultdict
# リストをデフォルト値にする
d = defaultdict(list)
# 存在しないキーにアクセスしてもエラーが発生しない
d["a"].append(1)
d["b"].append(2)
d["a"].append(3)
print(d) # defaultdict(<class 'list'>, {'a': [1, 3], 'b': [2]})
この例では、defaultdictにlistを指定しているため、存在しないキーにアクセスした場合でも、空のリストが自動的に作成され、要素を追加することができます。
また、defaultdictにintを指定することで、存在しないキーにアクセスした場合に、値が0で初期化されるようになります。以下は、defaultdictを使って単語の出現回数をカウントする例です。
from collections import defaultdict
text = "this is a pen. that is an apple. apple is a fruit."
# 単語の出現回数をカウントする
word_count = defaultdict(int)
for word in text.split():
word_count[word] += 1
print(word_count) # defaultdict(<class 'int'>, {'this': 1, 'is': 2, 'a': 2, 'pen.': 1, 'that': 1, 'an': 1, 'apple.': 1, 'apple': 1, 'fruit.': 1})
この例では、defaultdictにintを指定しているため、存在しないキーにアクセスした場合でも、値が0で初期化され、その後、単語が出現するたびにカウントされるようになります。
defaultdictを使うことで、存在しないキーにアクセスした際のエラーを回避することができます。また、初期値を指定することで、コードのシンプル化や実装の手間を省くことができます。
OrderedDictの使い方:辞書の順序を保持して操作
Pythonのcollectionsモジュールに含まれるOrderedDictは、辞書のサブクラスで、挿入された順序を保持することができます。通常の辞書とは異なり、要素の追加や削除を行っても、順序が変わることがありません。
例えば、以下のようにOrderedDictを作成して、キーと値を順に追加することができます。
from collections import OrderedDict
# OrderedDictを作成する
d = OrderedDict()
# キーと値を順に追加する
d["apple"] = 100
d["banana"] = 200
d["orange"] = 300
print(d) # OrderedDict([('apple', 100), ('banana', 200), ('orange', 300)])
この例では、空のOrderedDictを作成した後、キーと値を順に追加しています。最後にprint文でOrderedDictの内容を表示すると、追加した順序が維持されていることが確認できます。
また、OrderedDictは通常の辞書と同様に、要素の削除や変更も行うことができます。以下は、要素を削除した例です。
from collections import OrderedDict
# OrderedDictを作成する
d = OrderedDict()
# キーと値を順に追加する
d["apple"] = 100
d["banana"] = 200
d["orange"] = 300
# 要素を削除する
del d["banana"]
print(d) # OrderedDict([('apple', 100), ('orange', 300)])
この例では、削除した要素がOrderedDictから取り除かれた後でも、順序が変わっていないことが確認できます。
OrderedDictは、辞書の順序を重視する場合に便利な機能です。要素の追加や削除を行っても順序が変わらないため、データの管理が容易になります。
Counterの使い方:要素の出現回数をカウント
Pythonのcollectionsモジュールに含まれるCounterは、イテラブルなオブジェクト(リストや文字列など)の要素の個数をカウントするためのクラスです。例えば、以下のようなリストがあった場合、
fruits = ["apple", "banana", "apple", "orange", "banana", "apple"]
Counterを使うことで、各要素が何回出現したかを簡単にカウントすることができます。以下は、Counterを使った例です。
from collections import Counter
fruits = ["apple", "banana", "apple", "orange", "banana", "apple"]
# リストの要素をカウントする
fruit_count = Counter(fruits)
print(fruit_count) # Counter({'apple': 3, 'banana': 2, 'orange': 1})
この例では、Counterにリストを渡しているため、リストの要素の個数をカウントしています。Counterの結果は、各要素が何回出現したかを表す辞書の形式で返されます。
また、Counterは辞書と同様に、要素の追加や削除、更新も行うことができます。以下は、要素の削除と更新を行った例です。
from collections import Counter
# Counterを作成する
c = Counter(a=3, b=2, c=1)
# 要素を削除する
del c["c"]
# 要素を更新する
c.update({"a": 1, "b": 2, "d": 4})
print(c) # Counter({'a': 4, 'b': 4, 'd': 4})
この例では、Counterに最初から要素を持たせて作成し、要素の削除と更新を行っています。削除した要素はCounterから取り除かれ、更新した要素は既存の要素の個数に加えてカウントされます。
Counterは、要素の個数をカウントするためのクラスであり、リストや文字列などのイテラブルなオブジェクトに対して簡単に使うことができます。また、要素の追加や削除、更新も行えるため、データの管理が容易になります。
dequeの使い方:先頭・末尾のどちらからでも要素の追加・削除
Pythonのcollectionsモジュールに含まれるdequeは、双方向キュー(デック)を実現するためのクラスです。通常のリストと異なり、要素の追加・削除が先頭・末尾のどちらからでも高速に行えるため、キュー(FIFO)やスタック(LIFO)などのデータ構造を効率的に扱うことができます。
以下は、dequeの基本的な使い方の例です。
from collections import deque
# 空のdequeを作成する
d = deque()
# 右側に要素を追加する
d.append(1)
d.append(2)
d.append(3)
print(d) # deque([1, 2, 3])
# 左側に要素を追加する
d.appendleft(0)
print(d) # deque([0, 1, 2, 3])
# 右側から要素を取り出す
print(d.pop()) # 3
print(d) # deque([0, 1, 2])
# 左側から要素を取り出す
print(d.popleft()) # 0
print(d) # deque([1, 2])
この例では、空のdequeを作成した後、右側に要素を追加しています。右側に要素を追加する場合はappendメソッドを、左側に要素を追加する場合はappendleftメソッドを使用します。また、右側から要素を取り出す場合はpopメソッドを、左側から要素を取り出す場合はpopleftメソッドを使用します。
dequeは、リストに比べて先頭・末尾のどちらからでも高速に要素の追加・削除ができるため、キューやスタックなどのデータ構造を扱う際に特に有用です。また、最大長を指定して作成することもでき、指定した長さを超えた要素は自動的に削除されます。
namedtupleの使い方:タプルに名前をつける
Pythonのcollectionsモジュールに含まれるnamedtupleは、タプルに名前をつけた新しいクラスを作成するための関数です。通常のタプルとは異なり、属性によるアクセスやイテレーションが可能であり、コードの可読性を向上させることができます。
以下は、namedtupleの基本的な使い方の例です。
from collections import namedtuple
# Pointクラスを作成する
Point = namedtuple("Point", ["x", "y"])
# Pointクラスのインスタンスを作成する
p = Point(1, 2)
# 属性によるアクセス
print(p.x) # 1
print(p.y) # 2
# イテレーション
for val in p:
print(val)
# 添字によるアクセス
print(p[0]) # 1
print(p[1]) # 2
# タプルとしての振る舞い
x, y = p
print(x, y) # 1 2
この例では、namedtupleを使ってPointクラスを作成し、そのインスタンスを作成しています。namedtupleの第1引数には、クラス名を指定し、第2引数には、属性名のリストを指定します。また、属性にアクセスする際は、ドット演算子を使用してアクセスすることができます。
namedtupleは、クラスを定義する際に冗長なコードを省略することができ、コードの可読性を向上させることができます。また、タプルと同様にイミュータブルであるため、安全にオブジェクトを扱うことができます。
まとめ
collectionsモジュールの便利な関数であるdefaultdict、OrderedDict、Counter、deque、namedtupleについて紹介し、サンプルコードを交えて使い方を解説しました。
- defaultdict:辞書におけるキーの存在確認を簡略化し、初期値の設定も容易にできる
- OrderedDict:辞書の順序を保持して操作ができる
- Counter:要素の出現回数をカウントできる
- deque:双方向キュー(デック)を実現し、先頭・末尾のどちらからでも要素の追加・削除が高速にできる
- namedtuple:タプルに名前をつけ、属性によるアクセスやイテレーションができるようにする
collectionsモジュールには、様々な便利なクラスが含まれているんですね。特に、Counterとdequeは、データ処理によく使われる機能だと思います。namedtupleも便利そうです。実際にプログラムで使ってみたいと思います。
Pythonのcollectionsモジュールは、便利な機能がたくさんあります。特に、データ処理においては、Counterやdequeが重宝されることが多いです。
ぜひ、実際のプログラムで使ってみて、効率的なコーディングを目指しましょう。また、collectionsモジュール以外にも、Pythonには多くの機能が用意されています。
Pythonの公式ドキュメントなども参考にして、より高度なプログラミング技術を身につけることをおすすめします。
コメント