Python
コンテナデータ型
list vs tuple vs dict vs set

リスト-タプル-辞書-セットの違いと、それらを使用する場合のまとめ

Pythonには4つの組み込みコンテナ型があります: List, Tuple, Dictionary, Set です。

この記事では、それぞれの型のプロパティを比較し、どのような場合に使用するかをまとめます。

1. リストとタプル

リストとタプルは最もよく似た型だ。 まず、どちらの型にも順序があり、インデックスを使って要素を取り出すことができる。 また、1つのリストやタプルの中に複数のタイプの要素を持つことができる。 このため、多くのケースで両方の型を使うことができる。

両方の型の用途を明確にするためには、その違いに注意することが重要です。 このセクションでは、この 2 つの型の違いを説明し、どのような場合にこの 2 つの型を使用すればよいかを説明します。

1.1. 不変性

リストとタプルの最も重要な違いは不変性です。 リストは自由に追加や削除ができ、リスト内の要素も簡単に変更できます。 一方、タプルは一度宣言すると追加、削除、変更ができません。

実際のアプリケーションで不変性が必要な場合とそうでない場合について考えてみよう。

Pythonのコンテナ型を使ってショッピングカートのいくつかの機能を実装することになりました。 ショッピングカートの基本的な機能で、追加や削除が可能でなければならないものは、商品リスト、ショッピングカート、ユーザーリストです。 これらの機能はリストを使うべきです。

逆に、不変である必要がある機能は何でしょうか? ユーザーのユーザー名やログイン日、あるいは加盟店の営業許可番号など、変更されないメタデータを思い浮かべるかもしれません。 このような情報は、データが不用意に変更されないように、タプルに格納するのが最適です。

アプリケーションの設計において不変性を考えることは、他の開発者とのコミュニケーションにも役立ちます。 なぜなら、リストとして実装された機能は不変であり、タプルとして実装された機能は変更すべきではないと、コード自体で表現することができるからです。

1.2. 型の多様性

前述したように、リストもタプルも複数の型の要素を一緒に含むことができます。 しかし、前節の延長線上で考えると、話は変わってきます。

リストは、フォームリスト、ショッピングカートリスト、ユーザーリストなどに使われると述べました。 これらのリストは同じ種類のアイテムをポシェットします。 ショッピングカートのリストには商品だけ、ユーザーリストにはユーザーだけ、といった具合です。

users = [user1, user2, user3].

一方、ユーザーのメタデータをタプルと考えると、タプルの要素は異なるタイプになります。

User1 = ('ID', 'Created At', '事業者登録番号', ... )

そして、これらのタプルのデータはリストにまとめることができます。

Users = [
    ('User1', 'ID', 'Created At', '事業者登録番号', ... )
    ('User2', 'ID', 'Created At', '事業者登録番号', ... )
    ('User3', 'ID', 'Created At', '事業者登録番号', ... )
]

1.3. まとめ

要約すると、タプルは1つのオブジェクトに関するさまざまな情報を保持するために使用でき、単純なクラスのように機能します。 リストは、タプルで構成される複数のオブジェクトをリストとして管理するために使用できます。 以上がリストとタプルの最も一般的な使い方である。

ここでもう一つ触れておこう。 ショッピングカートの商品リストはカート利用者のみがアクセスでき、利用者リストはサービス管理者のみがアクセスできるようにする。 これは今後も変わることのないルールだ。 では、異なるユーザーがアクセスできるリストをこのようにタプルで管理してはどうでしょうか?

admin_lists = ([User1, User2, ... ], ... )
customer_lists = ([article1, article2, ... ], ... )

おわかりのように、タプルにリストを含めると、そのリストの要素は変更可能です。 これは、タプルの不変性がリストに含まれる要素ではなく、リスト自体への参照に適用されるためです。

2. 辞書

辞書を他の3つの型と区別する主な特徴は、辞書を構成するキーと値のペアです。

辞書のキーは、リストやタプルのインデックスのような役割を果たします。 リストやタプルが特定の要素を取り出すために数値インデックスを使用するのに対し、辞書は値を取り出すためのキーとして、不変性が保証された任意の型を使用することができる。

これらの不変キーは、辞書のベースとなるハッシュ・テーブルのターゲットとして使用できる。 これには、キーが辞書に含まれているかどうかのチェックや、キーによる値の取得が、平均して O(1)の時間複雑度で行えるという利点がある。 これは、ある要素が含まれているかどうかを判断するためにリストやタプルを最大O(n)までトラバースするのに比べて経済的である。

キー値を使用できる辞書なので、タプルよりもモデル化が簡単です。 以下のように商品情報やユーザー情報を整理することができます。 特に、自由に変更可能である必要がある情報については。

これはまた別の記事で取り上げますが、不変の属性情報はNamedTuple型で簡単に管理できます。

Item1 = {
    "name""Product A"
    "価格"50.00,
    "説明""説明 A"
    "stock"10,
}
 
ユーザー1 = {
    "name""John Doe"
    "email""john@example.com"
    "住所""123通り"
}

ご覧のように、Python辞書はプロパティとプロパティ値を必要とするオブジェクトを実装する便利な方法です。

3. セット

セット型が他の3つの型と異なる主な特徴は2つある。

一つは重複を許さないことです。 set.add()メソッドで新しい値を追加するときや、set()コンストラクタで別のコンテナ型を変換するときに、セットは重複を排除します。 これにより、重複排除が他の言語よりも簡単になります。

よく使われる重複排除のパターンは、以下のように型をセットにキャストして、また元に戻すことです。

numbers = [1, 2, 2, 3, 3, 4, 5].
 
unique_numbers = list(set(numbers))
print(unique_numbers)
 
# 出力: [1, 2, 3, 4, 5]

集合の2つ目の性質は、包含の判定に有効であるということです。 2.辞書では、ハッシュテーブルを使ってキーが含まれるかどうかを効率的に判断できることを説明しました。 集合内の値もハッシュテーブルで整理されます。 これにより、ある項目が含まれているかどうかを素早く判断することができます。

さらに、セット型には、交差、和、差、集約の関係を教えてくれるメソッドが組み込まれています。 これは、これらの関数のコードを書く必要がないということでもある。

例えば、2つのリストの包含関係を比較したい場合、次のようにします。

fruits_in_market = ['apple', 'banana', 'orange', 'pineapple'].
cart = ['banana', 'orange'].
 
set_fruits_in_market = set(fruits_in_market)
is_superset = set_fruits_in_market.issuperset(cart).
 
print(is_superset)
 
# 出力: True

リストの1つをセットに変換するだけで、上記のようなシンプルなコードで強力なことができるようになります。

次に、ショッピングカートの機能を考えてみましょう。これは集合の2つの優れた機能を利用したものです。

まず、以下のように、重複を削除する必要があるカテゴリのリストを作成することができます。

product_categories = {"Electronics", "Books", "Clothing", "Home Decor", "Food"}

ウィッシュリストとショッピングカートのセットを比較すると、ウィッシュリストを使ってショッピングカートの商品にハートマークを付けることもできます。

wish_list = ['iPhone 14 pro', 'PlayStaion 5', 'Bose QC 45'].
cart = ['PlayStaion 5', 'Nintendo Switch'].
 
heart_list = set(wish_list).intersection(cart).
 
print(heart_list)
 
# 出力: {'PlayStaion 5'}.

4. まとめ

このセクションでは、Pythonの組み込みコンテナ型の特徴と使い方について見てきました。 4つの型の大まかな使い方を理解できるようにまとめました、 しかし、常にオープンマインドで、どのように使うかをクリエイティブに考えてください。

各タイプの詳細については、対応するサブポストを参照してください。


© 2023 All rights reserved.