Python Lists in Google's Python Class in Japanese

Google による Python の授業 (日本語訳)/ Google's Python Class (英語原文)

資料
日本語訳: 設定/ 入門/ 文字列/ リスト / 整列/ 辞書とファイル/ 正規表現/ ユーティリティ
英語原文: Set Up/ Introduction/ Strings/ Lists/ Sorting/ Dict and Files/ Reg. Exp./ Utilities

練習問題
日本語訳: 基本問題/ 新生児名/ 特殊なコピー/ アクセス履歴のパズル
英語原文: Basic Exercises/ Baby Names Exercise/ Copy Special Exercise/ Log Puzzle Exercise

講義映像
英語
1日目: Introduction, Strings/ Lists and Sorting/ Dicts and Files
2日目: Regular Expression/ Utilities/ Utilities urllib/ Conclusions

Python のリスト


Python には "list" という名前の, 強力な組み込みのリストの型があります. リストの定数は角括弧 [ ] の中に記述されます. リストは文字列と同じように, len() が使えたり, データを扱うのに 0 から始まる通し番号と角括弧を使います. (公式ページ python.org list docs を参照.)
  colors = ['red', 'blue', 'green']
  print colors[0]    ## red
  print colors[2]    ## green
  print len(colors)  ## 3

list of strings 'red' 'blue 'green'
リストの = による代入はコピーを作りません. 代わりに, メモリ上で 2つの変数が1つのリストを指し示すようにします.
  b = colors   ## リストをコピーしない

both colors and b point to the one list
"空リスト" は括弧 [ ] の組だけで表されます. '+' は 2つのリストを結合するので, [1, 2] + [3, 4] は [1, 2, 3, 4] になります (これは文字列に対する + のようなものです).

FOR と IN


Python の *for* と *in* は非常に便利で, 1つ目の例はリストに使います. *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 のコードは型を想起させる文法を持っていないので, 変数名は処理内容をはっきりさせる鍵になります.
*in* の構成は, ある要素がリスト (や他の集合に関する型) に入っているか どうかを確認する簡単な方法です. value in collection は value が collection の中に入っているかを確認し, True/False を返します.
  list = ['larry', 'curly', 'moe']
  if 'curly' in list:
    print 'yay'

for/in の構成は Python のコードでは頻繁に使われ, リスト以外のデータ型にも使えるので, これらの構文は覚えておくべきです. 集合の要素に対する繰り返し操作をするときに 他の言語での習慣があるかもしれませんが, Python では for/in を使うべきです.
for/in は文字列に対しても使えます. 文字列は文字のリストのような扱いなので, for ch in s: print ch は 文字列中のすべての文字を表示します.

Range


range(n) 関数は数字 0, 1, ..., n-1 を作り, range(a, b) は a, a+1, ..., b-1 を返します. どちらも最後の数字を含みません. for による繰り返しと range() 関数の組み合わせにより, 伝統的な数字の for による繰り返し処理が行えます.
  ## 0 から 99 までの数字を表示する
  for i in range(100):
    print i

性能を重視する場合のために, リスト全体を作る負担を避ける xrange() というものもあります (Python 3000 では, range() は高性能なので, xrange() は 忘れても構いません).

While による繰り返し処理


Python では標準的な while による繰り返し処理も行えて, *break*, *continue* 命令も C++ や Java のように, 最も内側にある繰り返し処理の方向を変えられます. 上の for/in による繰り返し処理は, 良くあるリスト中の全要素に対する繰り返し処理に使えますが, while による繰り返しでは, 通し番号を完全に制御することが出来ます. 次はリスト中の3つ目ごとの要素を操作している while による繰り返し処理です.
  ## リストの要素を 3つ目ごとに操作
  i = 0
  while i < len(a):
    print a[i]
    i = i + 3

リストのメソッド


次はよく使われるリストのメソッドです.
  • list.append(elem) -- リストの最後に 1つ要素を加える. 良くある誤り: 新しいリストを返すのではなく, 元のリストを変更するだけです.
  • list.insert(index, elem) -- 与えられた通し番号 index の場所に要素 elem を挿入し, それ以降の要素を右に 1つずらす.
  • list.extend(list2) -- list2 の要素を list の最後に加える. リストに + や += を使うのは, extend() を使うのと似ている.
  • list.index(elem) -- リストの先頭から与えられた要素を探し, その通し番号を返す. もしその要素がないなら ValueError を投げる (ValueError を出さずに確認するには in を使うこと).
  • list.remove(elem) -- 与えられた要素に一致する 1つ目をリストから除く (一致する要素がなければ ValueError を投げる).
  • list.sort() -- リストを整列させる (整列したリストは返り値ではない). (後で示す sorted() 関数を使う方が良い.)
  • list.reverse() -- リストの並びを逆にする (逆にしたリストは返り値ではない)
  • list.pop(index) -- 与えられた通し番号の要素を除いて, 返り値にする. 通し番号が省略されたときは, 一番右の要素を返す (おおまかには, append() の反対).

これらはリストオブジェクトに対するメソッドですが, len() はリスト (や文字列など) を引数に取る関数です.
  list = ['larry', 'curly', 'moe']
  list.append('shemp')         ## 最後に要素を加える
  list.insert(0, 'xxx')        ## 0番目に要素を追加
  list.extend(['yyy', 'zzz'])  ## 要素のリストを最後に追加
  print list  ## ['xxx', 'larry', 'curly', 'moe', 'shemp', 'yyy', 'zzz']
  print list.index('curly')    ## 2

  list.remove('curly')         ## その要素を探して除く
  list.pop(1)                  ## 'larry' を除いて返す. 
  print list  ## ['xxx', 'moe', 'shemp', 'yyy', 'zzz']

良くある誤り: 上のメソッドは変更されたリストを *返さず*, 元のリストを変更するだけであることに注意.
  list = [1, 2, 3]
  print list.append(4)   ## これはうまくいきません. append() は None を返します. 
  ## 正しいパターン:
  list.append(4)
  print list  ## [1, 2, 3, 4] (訳注: 左は原文のまま. append(4) を 2回では, [1, 2, 3, 4, 4] のはず.) 

リストの構築


良くある方法は, 空リスト [] から開始して, append() や extend() を使って要素をそのリストに追加します.
  list = []          ## 空リストから始める
  list.append('a')   ## 要素の追加に append() を使う. 
  list.append('b')

リストの切り取り


リストの切り取りは, 文字列の切り取りと同じように行えて, リストの一部分を変更するのにも使えます.
  list = ['a', 'b', 'c', 'd']
  print list[1:-1]   ## ['b', 'c']
  list[0:2] = 'z'    ## ['a', 'b'] を ['z'] に置き換える
  print list         ## ['z', 'c', 'd']

練習問題: list1.py


この節の内容に慣れるために, (Basic Exercises (英語原文), 基本問題 (日本語訳) にある) list1.py の問題で整列を使わないものに挑戦すること.
この資料は Google の Nick Parlante によって作成されたものの翻訳です. Google による Python の授業の文章と映像は Creative Commons Attribution 2.5 ライセンスの下で利用できます.