【Python】collectionsでデータをよりスマートに管理しよう!
データの管理は、プログラミングをする上でとても重要です。
Pythonには、様々なデータを管理するためのモジュールが用意されています。これらのモジュールを使えば、よりスマートにデータを管理することができます。
今回は、データをよりスマートに管理できるようになる「collections」モジュールを紹介します。「collections」モジュールには、辞書やリストと同様に、様々なデータを格納することができるコンテナがあります。これらのコンテナを使えば、データをより効率的に管理することができます。
では、そのようなコンテナについて見ていきましょう。
pythonのバージョンによって機能などが異なる場合があります。
それぞれのバージョンにおける説明は、Pythonのドキュメントを参照してください。
namedtuple
collections — namedtuple コンテナデータ型 — Python 3.11.0b5 ドキュメント
namedtupleは、タプルのように使えるデータ型で、要素をインデックス番号でアクセスするのではなく、フィールド名でアクセスできるようになります。例えば、次のように使います。
from collections import namedtuple
# 名前付きタプルを定義
Person = namedtuple('Person', ['name', 'age', 'gender'])
# 名前付きタプルを使ってインスタンスを作成
person1 = Person('Alice', 30, 'Female')
person2 = Person('Bob', 35, 'Male')
# 名前付きタプルのフィールドにアクセス
print(person1.name) # Alice
print(person2.age) # 35
こちらで詳しくまとめています。
deque
collections — deque コンテナデータ型 — Python 3.11.0b5 ドキュメント
dequeは、スタックやキューのようなデータ構造を実装するためのクラスです。要素の追加や削除を行う際に、リストよりも高速に処理ができるため、特に両端での要素の追加や削除を頻繁に行う場合に便利です。例えば、次のように使います。
from collections import deque
# dequeのインスタンスを作成
d = deque()
# 要素を追加
d.append('apple')
d.appendleft('banana')
# 要素を取り出す
print(d.pop()) # apple
print(d.popleft()) # banana
ChainMap
collections — ChainMap コンテナデータ型 — Python 3.11.0b5 ドキュメント
ChainMapは、複数のマップをまとめて、ひとつのマップのように扱えるようにするクラスです。複数のマップを連結して、ひとつのマップを表すことができるので、複数のマップを扱いやすくするために使われます。例えば、次のように使います。
from collections import ChainMap
# 複数の辞書を作成
dict1 = {'a': 1, 'b': 2}
dict2 = {'c': 3, 'd': 4}
# ChainMapで複数の辞書をまとめる
cm = ChainMap(dict1, dict2)
# 辞書と同様に使用できる
print(cm['a']) # 1
print(cm['c']) # 3
# 辞書を更新すると、元の辞書も更新される
cm['a'] = 10
print(dict1['a']) # 10
Counter
collections — Counter コンテナデータ型 — Python 3.11.0b5 ドキュメント
Counterは、各要素の出現回数を計算するためのクラスです。文字列やリストなどのシーケンスデータから、各要素の出現回数をカウントして、辞書型のオブジェクトとして返すことができます。例えば、次のように使います。
from collections import Counter
# Counterのインスタンスを作成
c = Counter(['apple', 'banana', 'apple', 'orange', 'banana'])
# 要素の出現回数を取得
print(c['apple']) # 2
print(c['banana']) # 2
print(c['orange']) # 1
OrderedDict
collections — OrderedDict コンテナデータ型 — Python 3.11.0b5 ドキュメント
OrderedDictは、要素を追加した順番を保持する辞書型のクラスです。通常の辞書では、要素を追加した順番は保持されませんが、OrderedDict では、要素を追加した順番を保持したままで、辞書と同じように使うことができます。例えば、次のように使います。
from collections import OrderedDict
# OrderedDictのインスタンスを作成
d = OrderedDict()
# 項目を追加
d['a'] = 1
d['b'] = 2
d['c'] = 3
# 項目を表示
for key, value in d.items():
print(key, value)
# 出力:
# a 1
# b 2
# c 3
defaultdict
collections — defaultdict コンテナデータ型 — Python 3.11.0b5 ドキュメント
defaultdictは、辞書型のクラスです。通常の辞書では、存在しないキーを参照しようとすると KeyError が発生しますが、defaultdict では、存在しないキーを参照した場合に、事前に設定したデフォルトの値を返すようになります。これにより、辞書のキーが存在するかどうかを判定する必要がなくなり、コードがスッキリします。例えば、次のように使います。
from collections import defaultdict
# defaultdictのインスタンスを作成
d = defaultdict(int)
# 値を参照
print(d['a']) # 0 (int関数が呼び出され、0が返される)
# 値を設定
d['b'] = 1
print(d['b']) # 1
# キーが存在しない場合に、タプルを返すようにする
d = defaultdict(lambda: (0, 0))
print(d['c']) # (0, 0) (lambda関数が呼び出され、(0, 0)が返される)
また、defaultdictでは、生成される値を返すための関数を指定することができます。上の例では、int関数やlambda関数を指定しています。
UserDict
collections — UserDict コンテナデータ型 — Python 3.11.0b5 ドキュメント
UserDictは、辞書型を継承することができるクラスです。辞書型を継承して、新しいクラスを作成することで、辞書型を拡張したり、カスタマイズすることができます。例えば、次のように使います。
from collections import UserDict
# UserDictを継承したクラスを作成
class MyDict(UserDict):
pass
# MyDictのインスタンスを作成
d = MyDict()
# 辞書と同様に使用できる
d['a'] = 1
d['b'] = 2
print(d['a']) # 1
UserList
collections — UserList コンテナデータ型 — Python 3.11.0b5 ドキュメント
UserListは、リスト型を継承することができるクラスです。リスト型を継承して、新しいクラスを作成することで、リスト型を拡張したり、カスタマイズすることができます。例えば、次のように使います。
from collections import UserList
# UserListを継承したクラスを作成
class MyList(UserList):
pass
# MyListのインスタンスを作成
user_list = MyList()
# リストと同様に使用できる
user_list.append(1)
user_list.append(2)
print(user_list[0]) # 1
UserString
collections — UserString コンテナデータ型 — Python 3.11.0b5 ドキュメント
UserStringは、文字列型を継承することができるクラスです。文字列型を継承して、新しいクラスを作成することで、文字列型を拡張したり、カスタマイズすることができます。例えば、次のように使います。
from collections import UserString
# UserStringを継承したクラスを作成
class MyString(UserString):
pass
# MyStringのインスタンスを作成
s = MyString('hello')
# 文字列と同様に使用できる
print(s.upper()) # HELLO
まとめ
「collections」モジュールを使えば、Pythonでデータをよりスマートに管理することができます。今回は、「collections」モジュールを使ったデータの管理方法を紹介しました。「Counter」、「defaultdict」、「OrderedDict」、「namedtuple」などの9つのコンテナを紹介しましたが、これらのコンテナを使えば、データをより効率的に管理することができます。また、使い方も辞書やリストと似ており、簡単に使うことができます。今後も、「collections」モジュールを使って、データの管理をスマートにしていきましょう。
コメント