Yomiage
メニュー

Python実践講座 04:リスト・辞書・集合と計算量

更新 2026/9/27 6:22:11 公開

投稿者: しゅりりん

到達点は、データの関係に合う入れ物を選ぶことです。前提は第03回です。

順番、対応、重複を分ける

listは順番を持つ列、dictはキーから値への対応、setは重複のない集合です。tupleは変更不能な列で、複数の値をまとめて返す用途にも使います。選択の基準は短く書けるかではなく、何を保存し何を検索したいかです。

from collections import Counter, deque

words = ["python", "rust", "python", "java"]
counts = Counter(words)
print(sorted(counts.items()))
print(sorted(set(words) & {"java", "python"}))
long_words = [word.upper() for word in words if len(word) >= 5]
print(long_words)
queue = deque(["基礎", "演習"])
queue.append("復習")
print(queue.popleft())
print(list(queue))

main.pyで実行すると、javaが1、pythonが2、rustが1と集計され、共通要素はjavaとpythonです。長い単語の変換結果はPYTHONが二つです。キューからは基礎が取り出され、演習・復習が残ります。集合の表示順に依存しないようsortedを使いました。

件数が増えたら何が増えるか

list内に値があるかを調べるinは、基本的に先頭から比較します。setやdictはハッシュを使い、平均的には高速な検索が期待できます。すべての要素の組合せを比較する二重ループは、入力が10倍なら作業が約100倍になる場合があります。

listの先頭削除を繰り返すと後続要素の移動が発生します。両端から追加・削除するキューにはdequeが向いています。dictのキーにはハッシュ可能な値が必要です。listはそのままキーにできず、tupleでも中身がハッシュ不能なら使えません。

内包表記は「抽出して変換する」小さな処理に便利ですが、多重のforと複雑な条件を詰め込むと読みにくくなります。また、反復している同じ辞書を途中で増減させると問題になるため、対象のコピーを使うか新しい結果を作ります。

練習と解答

練習:重複を除きつつ最初に現れた順番を保ってください。

解答例:この文字列の列なら list(dict.fromkeys(words)) でpython、rust、javaになります。単にsetへ変換すると順番の保証に頼れません。要素がリストなどの場合はキー化の方法や同一性の定義から考え直します。

公式資料

データ構造とcollectionsが参照先です。


Python全20回の目次 | 前の回 | 次の回

このブラウザでは Web Speech API が利用できません。

1 / 16 · 停止中