Python:リスト・タプル・辞書・集合の解説
音声
目次
基本の理解と今回できること
今回できるようになることは、リスト・タプル・辞書・集合の違いを説明できて、簡単な操作を自分で書けるようになることです。
Pythonのコレクションは、複数の値をまとめて扱うためのデータ構造です。リストは順序付きで後から変更でき、タプルは順序付きですが変更できません。辞書はキーと値の組で管理し、集合は順序を前提にせず重複を持たない要素の集まりです。
まずは短いコードで、動きの違いを確認します。
最小コードは次のとおりです。
# 最小コード:リスト/タプル/辞書/集合の基本比較
lst = [1, 2, 3] # リスト(変更可)
tpl = (1, 2, 3) # タプル(不変)
dct = {"a": 1, "b": 2} # 辞書(キー:値)
st = {1, 2, 2, 3} # 集合(重複除去)
lst.append(4)
# 表示
print("list:", lst)
print("tuple:", tpl)
print("dict keys:", list(dct.keys()))
print("set:", st)
このコードでは、4種類の変数を作ったうえで、appendによりリストだけを変更しています。出力を見ると、リストが更新されること、タプルがそのままであること、辞書がキーを持つこと、集合で重複が取り除かれることが確認できます。
データ型ごとの特徴と使い分けの基準
使い分けの基準は、順序が必要かどうか、変更するかどうか、キーで取り出すかどうか、重複を排除するかどうかで判断します。
リストは順序付きで、append や pop による追加や削除がしやすいです。タプルは不変なので、関数の戻り値として扱いやすく、辞書のキーとしても利用しやすいです(要素も含めてイミュータブルな場合に限ります)。辞書はキーを使って値を高速に取り出せます。集合はメンバーシップテストや集合演算(和・差・交差)が高速です。
型の確認は type() で行います。要素数は len() で確認します。
print(type(var))
print(len(var))
操作の実例とデバッグの見方
ここでは、よく使う操作の例を示します。デバッグの見方としては、printで値を逐次表示する方法が簡単です。大きなスクリプトではloggingを使うと便利です。次の例は、集合演算と辞書の取り扱いを示します。
# 集合と辞書操作の例
a = {1, 2, 3}
b = {2, 3, 4}
print("union:", a | b) # 和集合
print("intersection:", a & b) # 積集合
users = {"alice": 25, "bob": 30}
print("alice age:", users.get("alice"))
このコードでは、集合の和と積を表示し、辞書からキーで値を取り出します。出力例はunion: {1, 2, 3, 4}のようになります。
出力例は次のとおりです。
union: {1, 2, 3, 4}です。intersection: {2, 3}です。alice age: 25です。
要チェックとしては、まずprintで中間変数を出力して追いかけると状況を把握しやすいです。長期的には、logging.basicConfig(level=logging.DEBUG)を設定し、logging.debug()を使うと運用しやすいです。
1段ステップアップ:関数化と実行方法
小さなスクリプトを関数化すると再利用とテストが楽になります。ここではリストと集合の違いを確かめる関数を用意します。外部ライブラリは不要です。
# 関数化例:リストと集合で重複を扱う
def unique_list(seq):
"""順序を保持して重複を除去します"""
seen = set()
out = []
for x in seq:
if x not in seen:
seen.add(x)
out.append(x)
return out
data = [1,2,2,3,1]
print("unique_list:", unique_list(data))
このコードでは、順序を保ちながら重複を除去する関数を作り、結果を表示します。出力例は unique_list: [1, 2, 3] です。
実行方法は python file.py で実行するか、VSCode の「実行」ボタンから実行します。ファイル名を example.py にして python example.py をターミナルで実行すると確認できます。
外部ライブラリが不要なため、pip の操作は不要です。
注意(ここだけ)
-
集合や辞書のキーにミュータブル(変更できる)なオブジェクトを使うと
TypeErrorになります。回避するには、キーにタプルなどのイミュータブル型を使うか、キーとして使うデータをハッシュ可能な形に変換してください。
要約
- リストは順序付きで変更可能であり、追加や削除の操作に向いています。
- タプルは不変であり、安全に共有したい値や辞書のキーとして扱いたい値に向いています。
- 辞書はキーから値を高速に取り出せる連想配列として扱えます。
- 集合は重複の排除や集合演算が得意であり、要素の存在確認が高速です。
- 詰まりやすいポイントは「ミュータブルとイミュータブルの違い」であり、キーにできる型や各メソッドの挙動を要チェックにするとよいです。