リストは順序を持つミュータブルなシーケンス
Python で最もよく使われるコレクション型と言えば、やはり リスト です。値を順番に保持しておきたい、しかも後から追加・削除・並び替え・更新をする可能性がある——そんな場面では、ほぼ間違いなく python リストが第一候補になります。
作り方はシンプルで、角括弧 [] で囲むだけです:
リストには何でも入れられます。別のリストだって入れられます。とはいえ実務では、ユーザーのリスト、数値のリストのように、同じ種類のものだけを入れておくのが普通です。そのほうが扱いやすいですからね。
インデックスで要素を取り出す
リストの各要素には位置があり、先頭は0から始まります。取り出すときは角括弧を使います。
存在しないインデックスを指定すると IndexError が発生します。範囲外になる可能性がある場合は、事前に長さをチェックするか、アクセス部分を try で囲んでおきましょう。
python リストのスライス
スライスを使うと、リストから 範囲 を指定して要素を取り出せます。書き方は文字列と同じで、list[start:stop:step] の形式です。
押さえておきたいポイントが2つあります。
- スライスは必ず新しいリストを返します。スライスを変更しても元のリストには影響しません。
- 終了インデックスは含まれません。たとえば
nums[2:5]が返すのはインデックス 2, 3, 4 の要素で、5 は含まれません。
python リストに要素を追加する方法(append・extend・insert)
python リストに要素を追加するメソッドは3つありますが、それぞれ挙動が違うので、混同するとバグの原因になりがちです。
append(x)はxを 1つの要素として 末尾に追加します。xがリストであっても同じで、items.append([1, 2])とすればリスト自体が1つの要素として入ります。extend(iterable)はイテラブルの 各要素 を1つずつ追加します。items.extend([1, 2])なら2つの要素が追加されるイメージです。insert(i, x)は指定したインデックスに挿入するメソッドで、i以降にある要素はすべて1つ後ろにずれます。
右辺にリストを置いた += は、extend と同じ挙動になります:
続いて、要素を削除する方法を見ていきましょう。
リストに存在しない要素を remove() しようとすると、Python は ValueError を投げます。「あれば削除」という挙動にしたい場合は、事前に in でチェックするか、try で囲んでおきましょう。
インデックスを指定して削除したいときは del も使えます。
要素数・存在チェック・カウント
in を使うと、リストに特定の値が含まれているかをすっきり読みやすい形で確認できます。ただし、大きなリストに対して何度もこのチェックを行う場合は、set を使いましょう。set のメンバーシップ判定は O(1) で済むのに対し、リストは O(n) かかります。
python リストのソート
方法は2つあり、どちらを使うかで動きが変わってくるので要注意です。
いずれも reverse=True を指定すれば降順に並べ替えられます。
さらに、並び順をカスタマイズしたいときは key 関数を使います:
key は各要素に適用されて、その戻り値が比較対象になります。よくあるパターンとしては、文字列の長さで並べたり、特定の属性で並べたり、小文字に揃えてから比較したりといったケースですね。
python リストを逆順にする
用途に応じて、3つのやり方があります。
元のリストが不要なら in-place で、新しいコピーが欲しいならスライスで、新しいリストを作らずに逆順にループしたいだけなら reversed() を使う、と覚えておきましょう。
参照が共有される落とし穴
リストは ミュータブル(変更可能) で、変数はその参照を持っているだけです。つまり、2 つの変数が同じリストを指している、ということが起こり得ます:
b = a ではリストはコピーされません。b は同じリストに付いた別名になるだけです。コピーが欲しいなら、ちゃんとコピーを作る必要があります。
Pythonプログラマーなら誰でも一度はこれでハマります。覚えておいてください。リスト同士を = でつないでもコピーにはなりません。
ループで要素を追加してリストを作る
for ループのページで紹介した基本パターンはもうおなじみですよね。
可読性は高いので、これはこれで全然アリです。慣れてきたら、リスト内包表記を使えば同じ処理を 1 行で書けます。
リスト内包表記については、この先2ページ目でじっくり取り上げます。
ざっくり早見表
押さえておきたいメソッドを一覧でまとめておきます。
append(x)— 末尾に追加extend(iter)— イテラブルの各要素をまとめて追加insert(i, x)— インデックス i に挿入pop()/pop(i)— 要素を取り出して返すremove(x)— 最初に見つかった x を削除sort()/sort(key=...)/sort(reverse=True)— ソートreverse()— 逆順に並べ替えindex(x)— 最初に見つかった x の位置count(x)— x の個数copy()— シャローコピー
次のステップ
リストはPythonでいちばんよく使うデータ型です。次のページでは、リストの"イミュータブル版のいとこ"にあたるタプルを取り上げて、どんな場面でリストよりタプルを選ぶべきかを見ていきましょう。
よくある質問
Pythonでリストを作るにはどうすればいいですか?
角括弧の中にカンマ区切りで値を書くだけです。例えば fruits = ['apple', 'banana', 'cherry'] のように書きます。リストには任意の型を入れられますし、違う型を混ぜることもできますが、実務では同じ型で揃えるのが一般的です。
リストをソート(並べ替え)するには?
元のリストをその場で並べ替えたいなら .sort() メソッド、元を残したまま新しいソート済みリストが欲しいなら組み込み関数の sorted(list) を使います。どちらも降順にする reverse=True や、独自の基準で並べ替える key= 引数に対応しています。
リストを逆順にするには?
用途によって使い分けます。list.reverse() は元のリストをその場で反転、list[::-1] はスライスで新しい逆順リストを作成、reversed(list) は逆順で回せるイテレータを返します。破壊的か、コピーか、遅延評価かで選んでください。