Python リスト

Python には「list」という名前の優れたリスト型が組み込まれています。リストリテラルは角かっこ [ ] で記述します。リストは文字列と同様で、len() 関数と角かっこ [ ] を使用してデータにアクセスします。最初の要素はインデックス 0 です。(python.org の公式リストをご覧ください)。

  colors = ['red', 'blue', 'green']
  print(colors[0])    ## red
  print(colors[2])    ## green
  print(len(colors))  ## 3

文字列のリスト「red」「blue」「green」

リストに = を使用して代入しても、コピーは作成されません。代わりに、割り当てにより、2 つの変数はメモリ内の 1 つのリストを参照します。

  b = colors   ## Does not copy the list

colors と b の両方が 1 つのリストを参照している

「空のリスト」とは、空の二重かっこ [ ] です。+ は 2 つのリストを連結します。[1, 2] + [3, 4] は [1, 2, 3, 4] になります(文字列の + と同じです)。

FOR と IN

Python の *for* と *in* 構文は非常に便利です。まず、リストで使用します。*for* 構文(for var in list)を使用すると、リスト(または他のコレクション)内の各要素を簡単に調べることができます。反復処理中にリストに追加または削除しないでください。

  squares = [1, 4, 9, 16]
  sum = 0
  for num in squares:
    sum += num
  print(sum)  ## 30

リストにどのようなものが含まれているかがわかっている場合は、その情報をキャプチャする変数名(「num」、「name」、「url」など)をループで使用します。Python コードには型を思い出させる他の構文がないため、変数名は、何が起こっているのかを把握するための重要な方法です。(これは少し誤解を招く表現です。Python に慣れてくると、関数定義に型情報の追加を可能にする型ヒントへの参照が表示されます。Python は、プログラムの実行時にこれらの型ヒントを使用しません。これらの関数は、IDE(統合開発環境)や静的分析ツール(リンタや型チェッカーなど)などの他のプログラムで使用され、関数が互換性のある引数で呼び出されているかどうかを検証します)。

*in* 構文を単独で使用すると、要素がリスト(または他のコレクション)に表示されるかどうかを簡単にテストできます(value in collection)。値がコレクションに含まれているかどうかをテストして、True/False を返します。

  list = ['larry', 'curly', 'moe']
  if 'curly' in list:
    print('yay') ## yay

for / in 構文は Python コードで非常によく使用され、リスト以外のデータ型でも機能するため、構文を覚えておく必要があります。他の言語では、コレクションに対して手動で反復処理を開始する習慣があるかもしれませんが、Python では for/in のみを使用する必要があります。

for / in を使用して文字列を操作することもできます。文字列は文字のリストのように機能するため、for ch in s: print(ch) は文字列内のすべての文字を出力します。

範囲

range(n) 関数は 0、1、...、n-1 の値を返します。range(a, b) は、a、a+1、...、b-1 の値を返します(最後の値は返しません)。for ループと range() 関数を組み合わせることで、従来の数値 for ループを作成できます。

  ## print the numbers from 0 through 99
  for i in range(100):
    print(i)

パフォーマンスに敏感なケースでは、リスト全体を構築するコストを回避できる xrange() というバリアントも用意されています(Python 3 では、range() のパフォーマンスが向上しているため、xrange() は不要です)。

While ループ

Python には標準の while ループもあり、*break* 文と *continue* 文は C++ や Java と同様に動作し、最も内側のループの流れを変更します。上記の for/in ループは、リスト内のすべての要素を反復処理する一般的なケースを解決しますが、while ループではインデックス番号を完全に制御できます。リスト内の 3 番目の要素ごとにアクセスする while ループは次のとおりです。

  ## Access every 3rd element in a list
  i = 0
  while i < len(a):
    print(a[i])
    i = i + 3

メソッドの一覧表示

その他の一般的なリスト方法は次のとおりです。

  • list.append(elem) -- リストの末尾に単一の要素を追加します。一般的なエラー: 新しいリストを返さず、元のリストのみを変更します。
  • list.insert(index, elem) -- 指定されたインデックスに要素を挿入して、要素を右にシフトします。
  • list.extend(list2) は、list2 の要素をリストの末尾に追加します。リストで + または += を使用するのは、extend() を使用する場合と似ています。
  • list.index(elem) - 指定された要素をリストの先頭から検索し、そのインデックスを返します。要素が存在しない場合、ValueError をスローします(ValueError なしで確認するには「in」を使用します)。
  • list.remove(elem) -- 指定された要素の最初のインスタンスを検索して削除します(存在しない場合、ValueError をスローします)
  • list.sort() - リストをその場で並べ替えます(返しません)。(後述の sorted() 関数を使用することをおすすめします)。
  • list.reverse() - リストをその場で逆順にします(返しません)
  • list.pop(index) -- 指定されたインデックスにある要素を削除して返します。インデックスが省略されている場合は右端の要素を返します(append() の逆)。

これらはリスト オブジェクトのメソッドですが、len() はリスト(または文字列など)を引数として受け取る関数です。

  list = ['larry', 'curly', 'moe']
  list.append('shemp')         ## append elem at end
  list.insert(0, 'xxx')        ## insert elem at index 0
  list.extend(['yyy', 'zzz'])  ## add list of elems at end
  print(list)  ## ['xxx', 'larry', 'curly', 'moe', 'shemp', 'yyy', 'zzz']
  print(list.index('curly'))    ## 2

  list.remove('curly')         ## search and remove that element
  list.pop(1)                  ## removes and returns 'larry'
  print(list)  ## ['xxx', 'moe', 'shemp', 'yyy', 'zzz']

よくあるエラー: 上記のメソッドは、変更されたリストを*返す*のではなく、元のリストのみを変更します。

  list = [1, 2, 3]
  print(list.append(4))   ## NO, does not work, append() returns None
  ## Correct pattern:
  list.append(4)
  print(list)  ## [1, 2, 3, 4]

リストの作成

一般的なパターンの 1 つは、リストを空のリスト [] として開始し、append() または extend() を使用して要素を追加することです。

  list = []          ## Start as the empty list
  list.append('a')   ## Use append() to add elements
  list.append('b')

スライスの一覧表示

スライスは文字列の場合と同様にリストでも機能し、リストのサブパーツを変更するためにも使用できます。

  list = ['a', 'b', 'c', 'd']
  print(list[1:-1])   ## ['b', 'c']
  list[0:2] = 'z'    ## replace ['a', 'b'] with ['z']
  print(list)         ## ['z', 'c', 'd']

演習: list1.py

このセクションの内容を練習するには、list1.py の(基本演習の)並べ替えを使用しない問題を試してください。