≪いっしょにPython≫ プログラマーの実験ノート

 このページは,プログラム言語Pythonをこれから学ぼうと考えている筆者の備忘録です.
 そこそこ調べて書いていますが,仕様を精密に調べたものではありません.どちらかと言えば,実装されたPython 3を使ってみてどうなったかということを中心に書いたものです.いわば,実験ノートの記録です.
参考:このページでは,括弧(かっこ)を次のように読むことにする
• ( ) … かっこ,小かっこ,パーレン(単数形=parenthesis,複数形=parentheses)
• { } … 波かっこ,中かっこ,ブレース(brace)
• [ ] … 角かっこ,大かっこ,ブラケット(bracket)
• < > … 山かっこ,(angle bracket)

1. Pythonのリスト作成

(1) [ ]で囲んで,カンマで区切って書く

• リストは文字列とは異なり,ミュータブル(後で要素を書き換えることができる)
• 他の言語の配列とは異なり,異種の要素(文字列,整数,浮動小数点など)を並べてもよい.
【例 1.1】
>>> list1=['abc','1','あ']
>>> list2=['a', 10, 3.14]  (文字列,整数,浮動小数点数など異なる型の要素もリストにできる)

(2) list(文字列)で文字列から1文字ずつ取り出してリストにする

【例 1.2】
>>> str1='This is a pen.'
>>> list(str1)
→ ['T', 'h', 'i', 's', ' ', 'i', 's', ' ', 'a', ' ', 'p', 'e', 'n', '.']
(スペースもピリオドも,それぞれ1つずつの要素に分かれる)

(3) 文字列.split()で文字列のスペースをセパレータとして単語に分ける

【書式】
文字列.split()
• セパレータの'目印の文字'を省略すると,デフォルト(既定値)として半角スペース(' ')が区切り文字として用いられる.
 ただし,半角スペース(' ')をセパレータに指定した場合には,厳格に1つの半角スペース(' ')で1つの区切りができるのに対して,セパレータを省略した場合には半角スペース(' ')が幾つかつながっている場合にも,まとめて1つの区切りとなる.
 さらに,引数なしのデフォルト(既定値)で使うと,先頭の余分なスペース,全角スペース,印字されない空文字(タブ,改行など)も取り除いて1つの区切りになる.
【例 1.3.1】
>>> str1='This is a pen.'
>>> str1.split()
['This', 'is', 'a', 'pen.']
>>> str2 = 'desk chair 机 椅子' (半角スペースと全角スペースがある)
>>> str2.split()
→ ['desk', 'chair', '机', '椅子']
【書式】
文字列.split('目印の文字')
• 元の文字列中の'目印の文字'をセパレーターとして文字列を分割して,カンマ(,)区切りのリストが作られる.
• 新たにリストが作られ,split()を使っただけでは元の文字列は変化しない.
【例 1.3.2】
>>> str1='This is a pen.' (Thisとisの間にスペースが2つある)
>>> str1.split(' ')
['This', '', 'is', 'a', 'pen.'] (スペースのうちの1つが要素となっている)

(4) リストの内包表記

(参考) 数学における集合の外延的記法と内包的記法
 数学において,例えば集合を表すときに

のように「要素を1つずつ書き並べて表す方法」を外延的記法という.
 これに対して,

ように,「集合の要素が満たすべき性質を用いて表す方法」を内包的記法という.
 以下においては,これによく似たリストの内包表記を述べる.
i) 空リストに1つずつ要素を追加していく場合
(次に述べる2(1)参照)
【例 1.4.1】
>>> L1=[] (空のリストを作る)
>>> L1.append('a')
>>> L1.append('b')
>>> L1.append('c')
>>> L1
→ ['a', 'b', 'c']
ii) 上記の内容をforとrange()で表す
【例 1.4.2】
>>> L1=[] (空のリストを作る)
>>> alpha1 = 'abc'
>>> for kk in range(3)
>>>     L1.append(alpha1[kk])
>>> L1
→ ['a', 'b', 'c']
iii) 上記の内容をリスト内包表記で表す
【例 1.4.3】
>>> alpha1 = 'abc'
>>> L1 = [alpha1[kk] for kk in range(3)]
>>> L1
→ ['a', 'b', 'c']
iv) 20以下の正の偶数をリスト内包表記で表す
【例 1.4.4】
>>> L1 = [kk for kk in range(1, 21) if kk % 2 == 0]
>>> L1
→ [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
v) 10以下で3でも5でも割り切れない正の整数をリスト内包表記で表す
【例 1.4.5】
>>> L1 = [kk for kk in range(1,11) if (kk % 3 != 0) and (kk % 5 != 0)]
(% nはnで割った余り,!=は等しくない,論理演算のかつはand )
>>> L1
→ [1, 2, 4, 7, 8]

2. リストの書き換え

 Pythonのリストはミュータブル(後から個々の要素を書き換え可能)です.

(1) リスト.append(1つの要素) … リストの末尾に要素を1つ追加する

【書式】
リスト.append(1つの要素)
【例 2.1】
>>> list1=['spring','summer','fall']
>>> list1.append('winter')
>>> list1 (リスト名を入力すると内容が表示される)
['spring', 'summer', 'fall', 'winter'] (末尾にwinterが追加されている)

(2) リスト1.extend(リスト2) … リスト1にリスト2を結合する

【書式】
L1, L2が各々リストであるとき
L1.extend(L2)
または,複合代入演算子 += を使って,次のように書く
L1 += L2
• L1にL2の要素が結合される.
• L2は変化しない.
• ただし,L2にリストでなく1つの要素を書き込むと,L2の要素がバラバラになる.
• L1, L2がリストのときに,L1.append(L2)とすると,最後の要素がリストになる.(リストを要素とするリストになる)
【例 2.2】
>>> L1 = ['Sun','Mon','Tue','Wed']
>>> L2 = ['Thu','Fri','Sat']
>>> L1.extend(L2)
>>> L1 (リスト名を入力すると内容が表示される)
['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'] (L1の要素が追加されている)
>>> L2 (リスト名を入力すると内容が表示される)
['Thu', 'Fri', 'Sat'] (L2は変化していない)
>>> L1 = ['Sun','Mon','Tue','Wed']
>>> L2 = ['Thu','Fri','Sat']
>>> L1 += L2
>>> L1 (リスト名を入力すると内容が表示される)
['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'] (L1の要素が追加されている)
>>> L2 (リスト名を入力すると内容が表示される)
['Thu', 'Fri', 'Sat'] (L2は変化していない)
>>> L1 = ['spring','summer','autumn']
>>> L2 = 'winter'
>>> L1.extend(L2)
>>> L1
['spring', 'summer', 'autumn', 'w', 'i', 'n', 't', 'e', 'r']
(winterがバラバラになる.L1 += L2としても同様)
>>> L1 = ['Sun','Mon','Tue','Wed']
>>> L2 = ['Thu','Fri','Sat']
>>> L1.append(L2)
>>> L1
['Sun', 'Mon', 'Tue', 'Wed', ['Thu', 'Fri', 'Sat']]

(3) リスト1.insert(n, 要素1) … リスト1の元のオフセットn番(先頭を0番とする前からn番目)の前に要素1を挿入する

【書式】
L1がリスト,str1が1つの要素であるとき
L1.insert(n, str1)
• L1のオフセットn番の要素がstr1になる.
• オフセット0番を指定すると先頭に挿入される.
• 元のリストL1の要素数よりも大きなオフセットを指定すると,末尾に追加される.
• リストのオフセットに使う番号は,末尾を−1とする負の数によって指定してもよい.(リストの要素数を覚えていないとき,後ろから何番という数え方で挿入するときに便利)
• 元のリストL1の要素数をnとするとき,−nは先頭を表すが,それよりも小さな負の数を指定した場合でも先頭に追加される.
正(0)[0][1][2][n−2][n−1]
−n−n+1−n+2−2−1
【例 2.3】
>>> L1 = ['Jan','Feb','Mar','May']
>>> L1.insert(3, 'Apr')
>>> L1
→ ['Jan', 'Feb', 'Mar', 'Apr', 'May'] (3番目の前にAprが入るから,3番目がAprになる)
>>> L1.insert(0, 'Dec')
>>> L1
→ ['Dec', 'Jan', 'Feb', 'Mar', 'Apr', 'May']
>>> L1.insert(10, 'Jun')
>>> L1
→ ['Dec', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun']
>>> L1.insert(−1, 'Aug')
>>> L1
→ ['Dec', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Aug', 'Jun']
>>> L1.insert(−10, 'Nov')
>>> L1
→ ['Nov', 'Dec', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Aug', 'Jun']

(4) リストの要素を削除する

i) リスト.pop(オフセットの番号)
【書式】
L1がリスト,nがオフセットの番号であるとき
L1.pop(n)
• nが省略されたとき,既定値として−1すなわち末尾の要素が削除される
• nとして有効なオフセット(−要素数〜要素数−1)でないものを指定するとエラーになる
【例 2.4.1】
>>> L1 = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May']
>>> L1.pop(2)
>>> 'Mar'
>>> L1
→ ['Jan', 'Feb', 'Apr', 'May'] (元のリストの2番目の要素Marが削除される)
>>> L1.pop()
>>> 'May'
>>> L1
→ ['Jan', 'Feb', 'Apr'] (オフセットを省略すれば末尾の要素が削除される)
ii) del リスト[オフセットの番号]
【書式】
L1がリスト,nがオフセットの番号であるとき
del L1[n]
• nとして有効なオフセット(−要素数〜要素数−1)でないものを指定するとエラーになる
• リストはミュータブル(後から要素を書き換え可能)なので,L1[n] = 'abc'のように,リストの要素を左辺値として直接代入して書き換えることも可能
【例 2.4.2】
>>> L1 = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May']
>>> del L1[2]
>>> L1
→ ['Jan', 'Feb', 'Apr', 'May'] (元のリストの2番目の要素Marが削除される)
>>> del L1[5]
→ エラー
iii) リスト.remove(要素の値)
【書式】
L1がリスト,str1が1つの要素であるとき
L1.remove(str1)
• リストの中でのある要素のオフセット(番号)が分からなくても,その値が分かれば削除できる.
• リストは集合とは異なり,同じ値の要素が複数個存在できる.同じ値があるときに,remove()を使うと前に(左に)ある要素だけが削除される.
• リストの要素でない値を指定してremove()を使うとエラーになる.
【例 2.4.3】
>>> L1 = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May']
>>> L1.remove('Apr')
>>> L1
→ [ 'Jan', 'Feb', 'Mar', 'May']
>>> L1 = [ 'Jan', 'Feb', 'Mar', 'Jan', 'Apr', 'May']
>>> L1.remove('Jan')
>>> L1
→ ['Feb', 'Mar', 'Jan', 'Apr', 'May']

(5) リストの要素を並べ替える

i) リスト2 = sorted(リスト1) … 元のリスト1を並び替えたリスト2ができる
【書式】
L1がリストであるとき
L2= sorted(L1)
L2= sorted(L1, reverse=True)
• リスト1の要素を昇順に並び替えてリストL2を作る.リスト1は変化しない.
• リストの要素に文字列と数値のような異質なものがあると,エラーになる.int(整数)型とfloat(浮動小数点)型の組なら,大小の順に並ぶ.
• オプションの引数reverse(全部小文字)=True(先頭は大文字)を指定すると降順に並び替える.
• 昇順とは,文字コード順なので,ひらがな相互,カタカナ相互では五十音順に並ぶが漢字はその読み方とは関係なく並ぶ.アルファベットではABC...(大文字が先)abc...(小文字が後)順…半角大文字,半角小文字,全角大文字,全角小文字の順
【例 2.5.1】
>>> L1=['もり みつこ','もりの ふくろう','もり はなえ','もりた たもり','もり もとしゅしょう','もりした じんたん']
(姓名を五十音順に並べるには,ひらがな[またはカタカナ]にそろえて,姓と名の間にスペースを入れなければならない.全角スペース(unicodeが\u3000の文字)はカナの中では文字コードが一番小さいので,姓と名の間に全角スペースを入れることによって,まず姓で順位をつけ,姓が同じものについては名で順位をつける.この並べ方が日常生活で普通に使われている方法で,下のL4のような並べ方は,不自然な印象を受ける)
>>> L2=sorted(L1)
>>> L2
→ ['もり\u3000はなえ', 'もり\u3000みつこ', 'もり\u3000もとしゅしょう', 'もりした\u3000じんたん', 'もりた\u3000たもり', 'もりの\u3000ふくろう']
>>> L3 = ['もりみつこ','もりのふくろう','もりはなえ','もりたたもり','もりもとしゅしょう','もりしたじんたん']
>>> L4 = sorted(L3)
>>> L4
→ ['もりしたじんたん', 'もりたたもり', 'もりのふくろう', 'もりはなえ', 'もりみつこ', 'もりもとしゅしょう']
(このような姓名一貫の順位付けは,ほとんど使われないので注意)
>>> L5 = [30,2,12]
>>> L6 = sorted(L5)
>>> L6
→ [2, 12, 30] (数値として並べた場合,数字の小さいもの順に並ぶ)
>>> L7 = ['30','2','12']
>>> L8 = sorted(L7)
>>> L8
→ ['12', '2', '30'] (文字として並べた場合,第1文字の小さいもの順に並ぶ)
>>> L9 = ['森 光子','森乃 福郎','森 英恵','森田 タモリ','森 元首相','森下 仁丹']
>>> L10 = sorted(L9)
>>> L10
→ ['森\u3000元首相', '森\u3000光子', '森\u3000英恵', '森下\u3000仁丹', '森乃\u3000福郎', '森田\u3000タモリ']
(漢字のまま並べ替えても,文字コード順になるだけで,日常使う順序[五十音順]とは関係ないものができる)
>>> L11 = [['もり みつこ','森 光子'],['もりの ふくろう','森乃 福郎'],['もり はなえ','森 英恵'],['もりた たもり','森田 タモリ'],['もり もとしゅしょう','森 元首相'],['もりした じんたん','森下 仁丹']]
>>> L12 = sorted(L11)
>>> L12
→ [['もり\u3000はなえ', '森\u3000英恵'], ['もり\u3000みつこ', '森\u3000光子'], ['もり\u3000もとしゅしょう', '森\u3000元首相'], ['もりした\u3000じんたん', '森下\u3000仁丹'], ['もりた\u3000たもり', '森田\u3000タモリ'], ['もりの\u3000ふくろう', '森乃\u3000福郎']]
(ひらがな五十音と漢字の姓名から成るリストのリストをソートすると,第1要素の五十音順に並ぶ)
>>> L13 = ['A','B','B','A','a','b','a','b']
>>> L14 = sorted(L13)
>>> L14
→ ['A', 'B', 'a', 'b', 'A', 'B', 'a', 'b']
(アルファベットは,半角大文字,半角小文字,全角大文字,全角小文字の順で各々abc...順に並ぶ)
ii) リスト.sort() … 元のリストが並び替わる
【書式】
L1がリストであるとき
L1.sort()
L1.sort(reverse=True)
• リストの要素を昇順に並び替える.
• リストの要素に文字列と数値のような異質なものがあると,エラーになる.int(整数)型とfloat(浮動小数点)型の組なら,大小の順に並ぶ.
• オプションの引数reverse(全部小文字)=True(先頭は大文字)を指定すると降順に並び替わる.
• 昇順とは,文字コード順なので,ひらがな相互,カタカナ相互では五十音順に並ぶが漢字はその読み方とは関係なく並ぶ.
【例 2.5】
>>> L1 = [3.14, -2.1, -5]
>>> L1.sorted(reverse=True)
>>> L1
→ [3.14, -2.1, -5] (大きい順に並ぶ)
>>> L2 = ['3.14','-2.1','-5']
>>> L2.sorted(reverse=True)
>>> L2
→ ['3.14', '-5', '-2.1'] (負の記号−は0〜9よりも文字コードが小さい)

(6) リストの代入とコピー

i) リスト2 = リスト1.copy() … 元のリスト1をコピーして別のリスト2を作る
【書式】
L1がリストであるとき
L2 = L1.copy()
• リスト1をコピーして別のリスト2を作る.
• リスト2はリスト1をコピーした別のリストなので,リスト1とリスト2は連動しておらず,一方を書き換えても他方には影響しない.
(次に述べるリストの代入との相違に注意)
【例 2.6.1】
>>> L1 = ['a','b','c']
>>> L2 = L1.copy()
>>> L2
→ ['a','b','c']
>>> L2[1] ='x'
>>> L2
→ ['a','x','c']
>>> L1
→ ['a','b','c']
ii) リスト2 = リスト1 … リスト1を代入してリスト2を作る
 Pythonにおいては,「リスト,辞書,集合のようなミュータブルな型」で1つの変数を他の変数に代入すると,その変数の参照(メモリのアドレス)が渡されるので,2つの変数は連動し,一方の要素を書き換えると他方の要素も書き換わる.
 これに対して,「int, float, 文字列,タプルのようなイミュータブルな型」で1つの変数を他の変数に代入すると,その値が渡されるので,2つの変数は連動せず,一方を書き換えても他方は影響を受けない.
(この内容は難しく,この教材の管理人もまだ学習中なので,とりあえずこれくらいを記憶にとどめる程度とする)
【書式】
L1がリストであるとき
L2 = L1
• リスト1の参照(メモリのアドレス)を渡すので,L1とL2は連動しており,一方の要素を書き換えると他方も書き換わる.
【例 2.6.2】
>>> L1 = ['a','b','c']
>>> L2 = L1
>>> L2
→ ['a','b','c']
>>> L2[1] ='x'
>>> L2
→ ['a','x','c']
>>> L1
→ ['a','x','c']

3. リストの要素の検査

(1) len(リスト) … リストの要素数を取得する

【例 3.1】
>>> L1 = ['a','bc','def']
>>> len(L1)
→ 3
>>> L2 = [['a','b'],['c','d','e'],['f'],[]]
>>> len(L2)
→ 4 (len(L2)は一番外側のリストの要素数.末尾の要素は空リストであるが,1つの要素に数える)
>>> len(L2[1])
→ 3 (リストの2番目の要素はリストで,その要素数は3)

(2) リスト.count(x) … リストの中にxという要素が何個含まれているかを数える

【書式】
L1がリスト,xが何個あるか調べたいとき
L1.count(x)
• リストの要素としてxに完全一致するものが何個あるかを返す.
• 文字列.count(sub)の場合は,文字列の中で部分的にsubに一致する個数も返すが,リスト.count(x)の場合は,xに部分一致するものは数えない.
【例 3.2】
>>> L1=['Tokyo','Osaka','Kyoto','Nagasaki','Tokyo']
>>> L1.count('Tokyo')
→ 2
>>> L1.count('a')
→ 0 (aはたくさんあるように見えるが,部分一致するものは数えない)
>>> L1[3].count('a')
→ 3 (L1[3]は文字列で,L1[3].count('a')はNagasakiで部分一致するものが3個と数える)

(3) リスト.index(x) … リストの中にxが含まれている要素のオフセット(番号)を返す

【書式】
L1がリスト,xがその要素であるとき
L1.index(x)
L1.index(x, start, stop)
• リストの中にxが含まれている要素のオフセット(番号)を返す.
• xに完全一致するオフセットを返し,部分一致は含まない.
• ないときはエラーになる.複数個あるときは先頭のオフセットを返す.
• オプションとして,start, stopを指定したときは,オフセットの番号start以後stop未満で一致する最初の番号を返す.stopを略すれば末尾まで探す.
【例 3.2】
>>> L1=['Tokyo','Osaka','Kyoto','Nagasaki','Tokyo']
>>> L1.index('Kyoto')
→ 2 (オフセット番号2にKyotoがある)
>>> L1.index('a')
→エラー (aはたくさんあるように見えるが,部分一致するものは数えない)
>>> L1.index('Tokyo',2)
→ 4 (オフセット番号2以降にある最初のTokyoは4番)

(4) x in リスト … リストの中にxが含まれていればTrueを返す

【書式】
L1がリスト,xがその要素であるとき
x in L1
• リストの中にxが含まれていればTrueを返し,含まれていなければFalseを返す.
• xに完全一致する場合だけTrueで,部分一致は含まない.xが文字列の場合は,大文字・小文字,全角・半角も区別する.
【例 3.2】
>>> L1=['Tokyo','Osaka','Kyoto','Nagasaki','Tokyo']
>>> 'Oosaka' in L1
→ True
>>> 'oosaka' in L1
→False  (大文字・小文字,全角・半角も区別する)
>>> 'o' in L1
→ False (部分一致は含まない)

4. リストやrangeを使ったイテレーション

 C言語やJavascriptにおいて,forループ,whileループと呼ばれる「繰り返し処理」は,pythonではイテレーション(iteration:繰り返し,反復,ループの意味)と言われる

(1) for 変数 in range() … range()を使ったイテレーション

【書式】
for 回数を処理する変数 in range(回数): … (1)
繰り返す処理
for 回数を処理する変数 in range(start, stop, step): … (2)
繰り返す処理
• (1)の形で書くときは,回数は省略できない.
• (2)の形で書くとき,デフォルト(省略したときの既定値)としてstart=0,step=1に設定されており,stopの値の前で終了する.
• 例えば,stopが5の場合は,0, 1, 2 ,3 ,4の5つの値を順にたどって終わる(0≦n<5)ので,回数は5回になる.(省略されればstartは0になるから.)
• stepとして1以外の値,例えば2が指定されれば,繰り返されるたびに変数の値は2ずつ増える.
• stepとして負の値を指定すれば,繰り返されるたびに変数の値は減少する.
【例 4.1.1】
>>> sum1 = 0
>>> for kk in range(5):
      sum1 += kk
>>> sum1
→ 10  (0+1+2+3+4だから10になる)
>>> sum1 = 0
>>> for kk in range(1, 11, 2):
      sum1 += kk
>>> sum1
→ 25  (1+3+5+7+9だから25になる)
>>> sum1 = 0
>>> for kk in range(10, 0, -1):
      sum1 += kk
>>> sum1
→ 55  (10+9+8+7+6+5+4+3+2+1だから55になる)

(2) for 要素 in リスト … リストを使ったイテレーション

【書式】
for 要素 in リスト:
繰り返す処理
• リストの要素を順に調べて,処理を行う.
【例 4.2.1】
>>> for str1 in ['dog','cat','box','desk']:
      print(str1)

dog
cat
box
desk (print()関数はデフォルトで出力するたびに改行します)
>>> L1 = ['dog','cat','box','desk']
>>> for str1 in L1:
      print(str1, end=',')
→ dog,cat,box,desk, (print()関数はendオプションにより出力の末尾に付ける文字を指定できます)
>>> L1 = ['dog','cat','box','desk']
>>> for str1 in L1:
      print(L1.index(str1), str1, sep=':',end=',')
→ 0:dog,1:cat,2:box,3:desk, 
(print()関数はカンマで区切って複数個のオブジェクトを同時に出力できる.複数個のオブジェクトを出力するときの区切り文字はsepオプションで,出力の末尾に付ける文字はendオプションにより指定できます)
○== メニューに戻る ==