Python入門トップページ


目次

  1. プログラミング言語
  2. Anaconda - Jupyter Notebook / JupyterLab の環境設定
  3. Python の基礎
  4. リスト,タプル,辞書,集合
    1. リスト
    2. タプル
    3. 辞書
    4. 集合
  5. 再び Jupyter Notebook の操作
  6. Python の制御構文
  7. 関数
  8. 便利な関数など
  9. リストの内包表記
  10. 多次元リスト
  11. クラス
  12. 演習問題
  13. 雑多な情報

Python の基礎

リスト,タプル,辞書,集合

リストとタプル

リストやタプルを使うと複数の要素をまとめて管理できます.さらに,個々の要素はリストやタプルであっても良いでしょう.リストとタプルの違いは,リストがミュータブルで,タプルがイミュータブルであることです.つまり,リストの要素は書き換えが可能で,要素の追加や削除もできるのに対し,タプルは一旦定義すれば書き換えはできなくなります.

目次に戻る

リスト

リストの作成

リストを作成するには,カンマで区切って [ ] で囲います.あるいは,list() で空のリストを作成します.例えば,4つの得点をまとめて管理する scores というリストを作成します.


scores = [10, 30, 25, 20]
print(scores)
[10, 30, 25, 20]

次に,4人の名前をまとめて管理する names というリストを作成します.


names = ['Tanaka', 'Sato', 'Watanabe', 'Takahashi']
print(names)
['Tanaka', 'Sato', 'Watanabe', 'Takahashi']

空のリストを2種類の方法で作成します.


empty_names = []
empty_scores = list()
print(empty_names)
print(empty_scores)
[]
[]

次のように記述するとリストをゼロで初期化して作成することもできます.


five_scores = [0] * 5
print(five_scores)
[0, 0, 0, 0, 0]

何らかのパターンを繰り返すようなリストを作成することも可能です.


nine_scores = [10, 20, 30] * 3
print(nine_scores)
[10, 20, 30, 10, 20, 30, 10, 20, 30]

さらに,range()list() を組み合わせれば,連続した値のリストを生成することも可能です.range() による数値シーケンスの詳細はこちらを参照してください


ten_scores = list(range(0, 10))
print(ten_scores)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

目次に戻る

オフセットを使った要素の取り出し

要素の先頭がオフセット0になることに注意する必要があります.また,負のオフセットを使えば末尾から逆に数えます.この考え方は文字列の抽出と同じです.


names = ['Tanaka', 'Sato', 'Watanabe', 'Takahashi']
print(names[0])
print(names[3])
print(names[-2])
Tanaka
Takahashi
Watanabe

目次に戻る

スライスで要素を取り出す

文字列と同様にスライスが利用できます.


names = ['Tanaka', 'Sato', 'Watanabe', 'Takahashi']
print(names[1:3])
print(names[:2])
print(names[2:])
['Sato', 'Watanabe']
['Tanaka', 'Sato']
['Watanabe', 'Takahashi']

目次に戻る

要素の書き換え

オフセットで指定すれば良いでしょう.例えばオフセット1(つまり先頭から2要素目)の「Sato」を「Kato」に書き換えてみます.


names = ['Tanaka', 'Sato', 'Watanabe', 'Takahashi']
names[1] = 'Kato'
print(names)
['Tanaka', 'Kato', 'Watanabe', 'Takahashi']

目次に戻る

append( )で要素を追加

リストの末尾に要素を追加するには append() メソッドを利用します.なお,append() メソッドで追加できる要素の個数は1個に限られます.例えば「Okada」を末尾に追加します.


names = ['Tanaka', 'Sato', 'Watanabe', 'Takahashi']
names.append('Okada')
print(names)
['Tanaka', 'Sato', 'Watanabe', 'Takahashi', 'Okada']

目次に戻る

extend( )で複数の要素を追加

リストの末尾に複数の要素をまとめて追加するには extend() メソッドを利用します.例えば「Okada」と「Tanabe」を末尾に追加します.このとき,追加したい要素を [ ] で囲ってリストとして渡す必要があることに注意してください.


names = ['Tanaka', 'Sato', 'Watanabe', 'Takahashi']
names.extend(['Okada', 'Tanabe'])
print(names)
['Tanaka', 'Sato', 'Watanabe', 'Takahashi', 'Okada', 'Tanabe']

目次に戻る

insert( )で途中に要素を追加

リストの途中に要素を追加します.例えば,先頭を0番目として2番目に「Okada」を追加します.


names = ['Tanaka', 'Sato', 'Watanabe', 'Takahashi']
names.insert(2, 'Okada')
print(names)
['Tanaka', 'Sato', 'Okada', 'Watanabe', 'Takahashi']

目次に戻る

del で要素を削除

オフセットを指定して要素を削除するには del を使います.例えば,先頭を0番目とした2番目の「Watanabe」を削除します.


names = ['Tanaka', 'Sato', 'Watanabe', 'Takahashi']
del names[2]
print(names)
['Tanaka', 'Sato', 'Takahashi']

目次に戻る

remove( )で要素を削除

指定した値を削除するには remove() を使います.「Watanabe」を検索してその値を削除します.


names = ['Tanaka', 'Sato', 'Watanabe', 'Takahashi']
names.remove('Watanabe')
print(names)
['Tanaka', 'Sato', 'Takahashi']

ただし,先頭から検索された最初の要素しか削除しません(Python 3.5.3 および 3.9.12 で確認).次の names リストには「Watanabe」が3個含まれていますが,最初の要素しか削除されないことに注意してください.


names = ['Tanaka', 'Sato', 'Watanabe', 'Takahashi', 'Watanabe', 'Watabe', 'Tanabe', 'Watanabe']
names.remove('Watanabe')
print(names)
['Tanaka', 'Sato', 'Takahashi', 'Watanabe', 'Watabe', 'Tanabe', 'Watanabe']

目次に戻る

pop( )で取り出した要素を削除

pop() でインデックスを指定するとその要素を取り出すことができ,さらに取り出した要素がリストから削除されます.例えばインデックス 1 の 'Sato' を取り出します.


names = ['Tanaka', 'Sato', 'Watanabe', 'Takahashi']
names.pop(1)
'Sato'

この作業によりリスト name から 'Sato' が削除されました.


names
['Tanaka', 'Watanabe', 'Takahashi']

再びインデックス 1 の要素を pop() で取り出します.


names.pop(1)
'Watanabe'

取り出された 'Watanabe' が削除されたことが確認できます.


names
['Tanaka', 'Takahashi']

なお,pop() でインデックスを省略すると最後の要素(つまりインデックス -1)が削除されます.


names = ['Tanaka', 'Sato', 'Watanabe', 'Takahashi']
names.pop()
'Takahashi'

names
['Tanaka', 'Sato', 'Watanabe']

この pop()append() を組み合わせて使うと,キューやスタックといったデータ構造を作成することができます.

目次に戻る

index( ) で要素のオフセットを得る

「Watanabe」 という要素がリストの何番目にあるか知りたい場合には index を使います.結果はリストの先頭を0番目としたインデックス(つまりオフセット)で得られます.


names = ['Tanaka', 'Sato', 'Watanabe', 'Takahashi']
idx = names.index('Watanabe')
print(idx)
2

ただし,検索したい値がリストに複数含まれていても最初に見つかったインデックスしか得ることができないことに注意してください.次の例では「Watanabe」が3個含まれていますが,最初ののインデックスだけが得られています.


names = ['Tanaka', 'Sato', 'Watanabe', 'Takahashi', 'Sato', 'Watanabe', 'Watanabe']
idx = names.index('Watanabe')
print(idx)
2

目次に戻る

値があるかどうか知りたい

値があるかどうか調べるには in を使います.値があれば True,なければ False が返ります.これは if 文による条件分岐を行うときによく利用されます.


names = ['Tanaka', 'Sato', 'Watanabe', 'Takahashi']
'Watanabe' in names
True

'Tanabe' in names
False

目次に戻る

値が何個あるか数えたい

count() を使えば良いでしょう.「Watanabe」は3個ありますが,「Abe」は存在しません.


names = ['Tanaka', 'Sato', 'Watanabe', 'Takahashi', 'Watanabe', 'Watabe', 'Tanabe', 'Watanabe']
names.count('Watanabe')
3

names.count('Abe')
0

目次に戻る

逆順にしたい

リストを逆順に並べ替えたいときには reverse() メソッドを使います.このとき,names リストそのものが(破壊的に)逆順になることに注意してください.


names = ['Tanaka', 'Sato', 'Watanabe', 'Takahashi']
names.reverse()
print(names)
['Takahashi', 'Watanabe', 'Sato', 'Tanaka']

目次に戻る

ソートしたい

sort()関数は(破壊的に)リストそのものを並べ替えます.これに対して,sorted()は並べ替えたリストを返す関数で,リストそのものを書き換えるわけではありません.

names そのものを並べ替えました.


names = ['Tanaka', 'Sato', 'Watanabe', 'Takahashi']
names.sort()
print(names)
['Sato', 'Takahashi', 'Tanaka', 'Watanabe']

names を並べ替えた結果を sorted_names に代入するだけで,names 自体は書き換えません.


names = ['Tanaka', 'Sato', 'Watanabe', 'Takahashi']
sorted_names = sorted(names)
print(sorted_names)
print(names)
['Sato', 'Takahashi', 'Tanaka', 'Watanabe']
['Tanaka', 'Sato', 'Watanabe', 'Takahashi']

目次に戻る

リストの長さを調べたい

リストに何個の値が入っているか,つまりリストの長さを調べるには len を使えば良いでしょう.


names = ['Tanaka', 'Sato', 'Watanabe', 'Takahashi']
l = len(names)
print(l)
4

目次に戻る

リストを複製したい

変数と同じような感覚でリストにリストを代入すると,思わぬ結果になる可能性があるので注意が必要です.変数の場合は,例えば変数 score を変数 new_score に代入したあと new_score の値を変更しても,score はその影響を受けることはありません.


score = 10
new_score = score
new_score += 5
print(score)
print(new_score)
10
15

しかしながら,リストにリストを代入したあと一方の値を変更すると,他方にも影響が及びます.つまり,リストの代入では新たなリストができているわけではなく,scoresnew_scores も同じ実体を参照していることになります.


scores = [10, 30, 25, 20]
new_scores = scores # リストの代入
new_scores[0] += 5 # この変更が scores にも影響する
scores[3] = 0 # この変更が new_scores にも影響する
print(scores)
print(new_scores)
[15, 30, 25, 0]
[15, 30, 25, 0]

リストを複製して新たなリストを作りたい場合は,copy() メソッドを使います.この場合は一方の値を変更しても他方に影響は及びません.


scores = [10, 30, 25, 20]
new_scores = scores.copy() # リストの複製
new_scores[0] += 5
scores[3] = 0
print(scores)
print(new_scores)
[10, 30, 25, 0]
[15, 30, 25, 20]

目次に戻る

リストに変換

文字列を単語に区切って,つまり空白文字で分割して,リストに変換します.


sent = 'Processing strings in Python is relatively easy.'
words =  sent.split(' ')
print(words)
['Processing', 'strings', 'in', 'Python', 'is', 'relatively', 'easy.']

上の例では最後のピリオドの処理に不満が残ります.この問題を解決するには strip を使って両端の「.」を取り除いてから split で分割する方法があります.


sent = 'Processing strings in Python is relatively easy.'
words = sent.strip('.').split(' ')
print(words)
['Processing', 'strings', 'in', 'Python', 'is', 'relatively', 'easy']

目次に戻る

リストにリストを含める

Python のリストは非常に自由度が高く,リストの要素にリストを含めたり,型の異なる要素を含めたりできます.例えば,kpc というキャンパスには3つの学部が存在し,kac には2つの学部が存在するとします.さらに,kgu という学校法人には kpckac という2つのキャンパスの他に,附属の高学校と中学校が存在する状況を一つのリスト kgu で表現することができます.次のようにリストを作成したあと,インデックスを指定すれば必要なデータを取り出すことができます.


kpc = ['law', 'business', 'pharmacy']
kac = ['nutrition', 'economics']
kgu = [kpc, kac, 'high school', 'middle school']
print(kgu)
print(kpc[1])
print(kgu[0])
print(kgu[0][1])
[['law', 'business', 'pharmacy'], ['nutrition', 'economics'], 'high school', 'middle school']
business
['law', 'business', 'pharmacy']
business

目次に戻る