Python:データ構造(list / dict)の解説
音声
目次
入門と今回できること
今回できるようになることは、listとdictの基本操作を読めて書けるようになることです。
listは配列のような順序付きコレクションで、順序とインデックスが重要です。dictはキーと値の組み合わせで、キーを使って値を取り出します。
どちらもミュータブルで、作成後に中身を変更できます。使い分けとしては、順序を扱う場合はlistを使い、キーで素早く検索したい場合はdictを使うのがポイントです。
例えば、ユーザー一覧はlistが向いていて、ユーザーIDから情報を引けるようなマッピングはdictが向いています。追加・削除・走査といった基本操作は、このあとで順に確認します。
listの基本と使い方
最小コードは次のとおりです。
# 最小コード:
nums = [3, 1, 4]
names = ["Alice", "Bob"]
nums.append(5)
names.insert(1, "Carol")
squares = [n * n for n in nums]
scores = {"Alice": 90, "Bob": 80}
scores["Carol"] = 85
for i, name in enumerate(names):
print(i, name, scores.get(name, "NoScore"))
このコードでは、listに要素を追加し、リスト内包表記で平方のlistを作り、dictにキーを追加してから、enumerateでインデックス付きで表示します。
実行方法は次のとおりです。
- ファイルに保存して、
python file.pyを実行します。 - または、VSCodeで「Run Python File in Terminal」を選んで実行します。
出力例は次のとおりです。
0 Alice 90
1 Carol 85
2 Bob 80
dictの基本と使い方
dictは波括弧で作ります。キーにはイミュータブルな型(文字列や数値など)を使います。以下の例では、典型的な操作をまとめて確認できます。
# dictのサンプル(補助コード)
p = {"a": 1, "b": 2}
print(p.get("a")) # 1を返します
print(list(p.keys())) # ['a','b'] を返します
p.update({"c": 3}) # 複数追加できます
print({k: v*10 for k, v in p.items()}) # dict内包表記で変換できます
このコードでは、getで安全に値を取得し、keys()やitems()で走査し、updateやdict内包表記でまとめて変更できます。
動作の確認では、型や要素数、内容の一部を出力して確かめるのが要チェックです。
print(type(var)) で型を確認できます。
print(len(list_var), list_var[:3]) で長さと先頭要素を確認できます。
print(list(d.keys()), list(d.values())) でdictの中身をチェックできます。
避けたい例として、リストの多重代入で参照が共有される問題があります。たとえば a = [[0]*3]*3 とすると各行が同じオブジェクト参照になり、a[0][0] = 1 が全行に影響します。この場合はリスト内包表記にして a = [[0]*3 for _ in range(3)] に変えると解消できます。
また、dictの要素アクセスで d["no_key"] を使うとKeyErrorになることがあります。存在しないキーの可能性がある場合は d.get("no_key") を使うと、デフォルト値を返す形にできます。
デバッグと1段ステップアップ
デバッグでは、まずprintで途中結果を出すと状況を把握しやすいです。より制御しやすい方法としてloggingモジュールを使うと、出力レベルを切り替えながら情報を残せます。
import logging
logging.basicConfig(level=logging.DEBUG, format="%(levelname)s:%(message)s")
logging.debug("変数の中身: %s", nums)
ログレベルに応じて出力が変わるため、printよりも必要な情報だけを出し分けやすくなります。
さらに一段進めるなら、処理を関数にまとめて例外処理やファイル入出力に対応すると再利用性が上がります。例外処理はtry/exceptで囲い、必要に応じてfinallyで後片付けをするのが基本です。
ファイル操作ではwithを使うと、処理の終了時に自動でクローズされて扱いやすいです。JSONの読み書きは外部ライブラリなしでも標準のjsonで十分です。
ファイル関連の例外が起きた場合は、例外内容をログに記録しつつ動作を継続する設計にすると運用しやすくなります。
注意(ここだけ)
-
リストや辞書での削除や上書きはデータを失う可能性があります。
例えば
やdel lst[i]
は元に戻せません。dict.pop(key)
要約
- listは順序付きコレクションであり、インデックス参照や順序処理に向いています。
- dictはキーで値を高速に取り出せる連想配列であり、マッピングに向いています。
- 基本操作は追加(append/update)、削除(pop/del)、走査(for/enumerate/items)です。
- デバッグはprintからloggingへ移行し、関数化と例外処理で1段ステップアップできます。
- 削除や上書きは元に戻らないため、バックアップやコピーを取る設計にすると要チェックです。