Python速習ガイド - ステップ1 基本的な文法とデータ型 (5) - リスト (1)
シリーズ - Python速習ガイド
コンテンツ
Info
- 本講座は、Pythonプログラミングの基礎を手を動かしながら最速で身につけるための講座です。
- 「スタイルガイド」では、Pythonできれいなコードを書くためのガイドライン(PEP8)で紹介されている内容を主に記載しています。
- 各コードは実行して結果を確認することができます。
ページの再読み込みで元の内容に戻りますので、自由にいじってみてください。
ステップ1 基本的な文法とデータ型
1.5. データをまとめる
1.5.1. リスト
- 複数の要素をまとめて扱いたい場合に リスト (
list
) を使用します。 - リストは角括弧(
[
,]
)内に要素をカンマ(,
)区切りで並べます。
スタイルガイド
- カンマ(
,
)の後にはスペースを1個分空けましょう。
- 長いリストの場合は複数行に分けると読みやすくなります。
- 各要素は行の先頭に スペース4個分 の字下げ(インデント)を追加します。
- 最後の要素の後ろにもカンマを入れましょう。
(要素追加時に余計な行差分が発生しなくなります)
リストの基本的な操作
要素取得
- リスト内の要素は以下のように角括弧で位置番号(インデックス)を指定して取得できます。
- インデックスは 0から始まる ことに注意してください。
- リストの範囲外のインデックスにアクセスしようとすると
IndexError
が発生します。
- 末尾からの順番を指定して要素を取得したい場合は、マイナスのインデックスを指定します。
📚練習問題
0.1
から1
までの0.1
刻みのリストを作成し、リスト内の 0.4
を出力してください。
(インデックスの指定方法を、先頭からと末尾からの2通りで試してください。)
要素書き換え
- リストの要素は代入で書き換えることができます。
長さを取得
- リストの長さを求めるには
len
関数を使用します。
要素追加 (append
)
- リストの末尾に要素を追加したい場合は
append
メソッドを使用します。- 「メソッド」についてはあとで詳しく扱いますが、簡単にいうと「型専用の関数」です。
その型の値の後ろに.<メソッド名>
を付けることで使用できます。
- 「メソッド」についてはあとで詳しく扱いますが、簡単にいうと「型専用の関数」です。
📚練習問題
リスト sports
に append
メソッドを用いてスポーツの名前を5つ追加し、画面出力してください。
リストのメソッド
位置番号取得 (index
)
index
メソッドを使用すると、指定した値の位置番号(インデックス)を取得できます。- 指定した値がリスト内に複数存在する場合は 最初のインデックス を返します。
- 指定した値がリスト内に存在しない場合は
ValueError
が発生します。
個数取得 (count
)
count
メソッドを使用すると、要素の個数を取得できます。
要素除去 (remove
)
remove
メソッドを使用すると、指定した要素をリストから除去します。
- 要素が複数存在する場合は、 最初の要素のみ が除去されます。
要素を取り出す (pop
)
pop
メソッドを使用すると、リストの末尾の要素を取り出してその値を返します。- 取り出された値はリストから削除されます
pop
メソッドの引数にインデックスを指定すると、その位置の要素をリストから取り出して返します。- 取り出された値はリストから削除されます
要素挿入 (insert
)
insert
メソッドを使用すると、指定したインデックスの位置に指定した値を挿入します。- 挿入位置より後ろのデータをずらしてから挿入する、という動作になるため、
末尾に追加するappend
メソッドと比較して実行に時間がかかります。
(詳しくは最後のコラムを参照)
- 挿入位置より後ろのデータをずらしてから挿入する、という動作になるため、
リスト拡張 (extend
)
extend
メソッドを使用すると、指定したリストを末尾につなげて元のリストを拡張します。
(append
は指定した要素の追加を行い、extend
は指定したリストのすべての要素を追加します)
- リスト同士の足し算(
+
)を行うと結合したリストが得られます。
(extend
メソッドと異なり、元のリストは変更されずに新しいリストが作成されます。)
📚練習問題
前回の練習問題で作成したリストを append メソッドではなく extend メソッドを用いて作成し、画面出力してください。
コラム:リスト操作の計算量
プログラミングでは、各処理にかかる時間(計算量)を意識することも重要です。
各関数やメソッド等の計算量を理解することで、
特に大量のデータを扱う際のパフォーマンスを向上させることができます。
※ 表中の計算量の意味:
O(1)
:入力サイズに関係なく、一定時間で処理されるO(n)
:最悪の場合、入力データ(リスト)のサイズn
に比例した時間がかかるO(k)
:最悪の場合、2つ目の入力データ(リスト)のサイズk
に比例した時間がかかる
操作 | 計算量 | 説明 |
---|---|---|
list[i] (要素取得) |
O(1) | インデックスを指定して要素を取得する操作は高速 |
list[i] = x (要素書き換え) |
O(1) | インデックスを指定して要素を書き換える操作は高速 |
len(list) |
O(1) | リストのサイズは内部で保持されているため高速 |
append(x) |
O(1)(平均) | 通常は定数時間だが、まれにメモリ再確保により O(n) になることがある |
index(x) |
O(n) | 先頭から順に検索する必要があり、最悪で全要素を調べる可能性がある |
count(x) |
O(n) | リスト全体を走査して一致する要素の数を数える必要がある |
remove(x) |
O(n) | 該当要素を先頭から検索し、見つかった位置から要素を詰める必要がある |
pop() (引数なし) |
O(1) | リストの末尾を削除する処理は高速 |
pop(i) (インデックス指定) |
O(n) | 指定位置の要素を削除した後、後続の要素をすべて左に移動させる必要がある |
insert(i, x) |
O(n) | 挿入位置以降の要素をすべて右にずらす必要があるため、時間がかかる |
extend(list2) |
O(k) | 追加するリストの要素数 k に比例した時間がかかる |
list1 + list2 |
O(n + k) | 両方のリストをコピーして新しいリストを作成するため、合計要素数に比例した時間がかかる |
このあたりの計算量やアルゴリズムに興味のある方には、以下の書籍がおすすめです:
- 『プログラミングコンテスト攻略のためのアルゴリズムとデータ構造』(渡部有隆 他著、マイナビ出版)