コンテンツ

Python速習ガイド - ステップ1 基本的な文法とデータ型 (5) - リスト (1)

Info
  • 本講座は、Pythonプログラミングの基礎を手を動かしながら最速で身につけるための講座です。
  • 「スタイルガイド」では、Pythonできれいなコードを書くためのガイドライン(PEP8)で紹介されている内容を主に記載しています。
  • 各コードは実行して結果を確認することができます。
    ページの再読み込みで元の内容に戻りますので、自由にいじってみてください。
  • 複数の要素をまとめて扱いたい場合に リスト (list) を使用します。
  • リストは角括弧([, ])内に要素をカンマ(,)区切りで並べます。
スタイルガイド
  • カンマ(,)の後にはスペースを1個分空けましょう。
  • 長いリストの場合は複数行に分けると読みやすくなります。
    • 各要素は行の先頭に スペース4個分 の字下げ(インデント)を追加します。
    • 最後の要素の後ろにもカンマを入れましょう。
      (要素追加時に余計な行差分が発生しなくなります)
  • リスト内の要素は以下のように角括弧で位置番号(インデックス)を指定して取得できます。
  • インデックスは 0から始まる ことに注意してください。
  • リストの範囲外のインデックスにアクセスしようとすると IndexError が発生します。
  • 末尾からの順番を指定して要素を取得したい場合は、マイナスのインデックスを指定します。
📚練習問題

0.1から1までの0.1刻みのリストを作成し、リスト内の 0.4 を出力してください。
(インデックスの指定方法を、先頭からと末尾からの2通りで試してください。)

  • リストの要素は代入で書き換えることができます。
  • リストの長さを求めるにはlen関数を使用します。
  • リストの末尾に要素を追加したい場合はappendメソッドを使用します。
    • 「メソッド」についてはあとで詳しく扱いますが、簡単にいうと「型専用の関数」です。
      その型の値の後ろに.<メソッド名>を付けることで使用できます。
📚練習問題

リスト sportsappend メソッドを用いてスポーツの名前を5つ追加し、画面出力してください。

  • indexメソッドを使用すると、指定した値の位置番号(インデックス)を取得できます。
    • 指定した値がリスト内に複数存在する場合は 最初のインデックス を返します。
    • 指定した値がリスト内に存在しない場合は ValueError が発生します。
  • countメソッドを使用すると、要素の個数を取得できます。
  • removeメソッドを使用すると、指定した要素をリストから除去します。
  • 要素が複数存在する場合は、 最初の要素のみ が除去されます。
  • popメソッドを使用すると、リストの末尾の要素を取り出してその値を返します。
    • 取り出された値はリストから削除されます
  • popメソッドの引数にインデックスを指定すると、その位置の要素をリストから取り出して返します。
    • 取り出された値はリストから削除されます
  • insertメソッドを使用すると、指定したインデックスの位置に指定した値を挿入します。
    • 挿入位置より後ろのデータをずらしてから挿入する、という動作になるため、
      末尾に追加するappendメソッドと比較して実行に時間がかかります。
      (詳しくは最後のコラムを参照)
  • 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) 両方のリストをコピーして新しいリストを作成するため、合計要素数に比例した時間がかかる

このあたりの計算量やアルゴリズムに興味のある方には、以下の書籍がおすすめです:

  • 『プログラミングコンテスト攻略のためのアルゴリズムとデータ構造』(渡部有隆 他著、マイナビ出版)

関連記事