3秒でわかる
複数の値を順番付きで並べて持つデータ構造。0 から始まる添字で取り出せ、あとから要素を足したり消したりして長さを変えられます。
もう少し詳しく
どういうものか
値を一列に並べ、それぞれに 0 から始まる位置番号を振って管理するデータ構造。Python の list、JavaScript の Array、Java の ArrayList がこれにあたる。並び順が保たれること、同じ値を何個入れてもよいこと、長さがあとから変えられることが特徴になる。
内部の作りは 2 系統ある。1 つは要素をメモリ上に連続して置く配列型で、添字での取り出しが一定時間で終わる。もう 1 つは各要素が次の要素の場所を指す連結リスト型で、途中への挿入が速い。Python や JavaScript の標準のリストは前者に近い。
なぜ必要か
変数を name1、name2、name3 と増やしていくやり方は、件数が実行時まで決まらない場面で破綻する。リストにまとめれば、何件あっても 1 つの名前で扱え、繰り返し処理をそのまま当てられる。ファイルの各行、API の返す配列、フォームの選択肢など、扱うデータはたいてい「同じ種類のものが不定個」の形をしている。
具体例
scores = [72, 88, 95, 60]
print(scores[0]) # 72 先頭は 0 番
print(scores[-1]) # 60 後ろから数える書き方
print(len(scores)) # 4
scores.append(80) # 末尾に追加 -> [72, 88, 95, 60, 80]
scores.insert(1, 100) # 1番目に割り込み -> [72, 100, 88, 95, 60, 80]
del scores[2] # 2番目を削除
for s in scores:
print(s)
high = [s for s in scores if s >= 80] # 条件で絞った新しいリスト
print(sum(scores) / len(scores)) # 平均つまずきやすいところ
添字が 0 から始まる点は、4 件のリストの最後が scores[4] ではなく scores[3] になるという形で必ず一度は引っかかる。
もう 1 つ厄介なのが、ループで回している最中に同じリストから要素を消す操作。削除のたびに後ろの要素が前へ詰まるため、走査が 1 つ飛ばしになる。新しいリストを作って入れ替えるほうが安全になる。
Python では代入がコピーではない点も落とし穴になる。b = a と書いた b は a と同じ実体を指すので、b を変えると a も変わる。切り離すには list(a) のように新しいリストを作る。
似た用語との違い
| 構造 | 順番 | 重複 | 主な用途 |
|---|---|---|---|
| リスト | あり | 可 | 並び順のある一覧 |
| 集合 | なし | 不可 | 含まれるかの判定 |
| 辞書 | 挿入順 | キーは不可 | キーで引く対応表 |