新規記事の投稿を行うことで、非表示にすることが可能です。
2020年12月29日
リスト,タプル
記事内容の出典:フリーテキスト「Python3入門」
このページの更新:2020/12/29
リストは複数の値を並べて束ねるもので,実際のプログラミングにおいて頻繁に使用されるデータ構造です.リストは複数の値(要素)をコンマ「,」で区切って書き並べたものを四角い括弧 [ … ] で括った形式で記述します.
リストの要素には,数値,文字列など,あらゆる種類のデータを与えることができます.(次の例)
lst1 = [1,3,5,7,9,11,13,15]
lst2 = ['中村','田中','佐藤']
lst3 = ['中村',51,'田中',32,'佐藤',21]
lst4 = [0,[10,11],2,[30,31,32],4]
print( lst1 )
print( lst2 )
print( lst3 )
print( lst4 )
実行結果:
[1, 3, 5, 7, 9, 11, 13, 15]
['中村', '田中', '佐藤']
['中村', 51, '田中', 32, '佐藤', 21]
[0, [10, 11], 2, [30, 31, 32], 4]
lst1 は数値のリスト,lst2 は文字列のリスト,lst3 は文字列と数値が混在するリストです.リストは要素にリストを含む(リストを入れ子にする)ことができ,lst4 はその例です.
スライスによるリストの要素へのアクセス
別の記事「文字列」のところでスライスについて解説していますが,リストの場合も同様にスライスを使用することができます.(次の例)
lst = ['零','一','二','三','四','五','六']
print( 'lst[0]=\t\t',lst[0] )
print( 'lst[6]=\t\t',lst[6] )
print( 'lst[3:5]=\t',lst[3:5] )
print( 'lst[1:7:2]=\t',lst[1:7:2] )
print( 'lst[:3]=\t',lst[:3] )
print( 'lst[3:]=\t',lst[3:] )
print( 'lst[-1]=\t',lst[-1] )
print( 'lst[-2]=\t',lst[-2] )
print( 'lst[-3]=\t',lst[-3] )
実行結果:
lst[0]= 零
lst[6]= 六
lst[3:5]= ['三', '四']
lst[1:7:2]= ['一', '三', '五']
lst[:3]= ['零', '一', '二']
lst[3:]= ['三', '四', '五', '六']
lst[-1]= 六
lst[-2]= 五
lst[-3]= 四
入れ子のリストを応用した多次元配列
入れ子のリストで多次元配列を実現することができます.下に示す例は,「行」「列」から成る2次元配列をリストで実現するものです.
tbl = [[ 0, 1, 2],
[10,11,12],
[20,21,22]]
見やすくするために,書く要素毎に改行して入力しています.
この tbl は2次元配列とみなして使用することができ, tbl[行][列] という記述で要素にアクセスできます.(次の例)
print( tbl[0][1] )
print( tbl[1][2] )
print( tbl[2][0] )
実行結果:
1
12
20
リストの要素の書き換え
リストの内容は事後で書き換えることができます.(次の例)
lst = [0,1,2,3,4,5]
lst[3] = 'x'
print( lst )
実行結果:
[0, 1, 2, 'x', 4, 5]
このように事後で変更できるデータ構造をミュータブルであると表現します.
ミュータブルでないデータ構造の1例が文字列(str型)で,文字列を事後に変更しようとするとエラーとなります.(次の例)
s = '012345'
s[3] = 'x'
実行結果:
TypeError Traceback (most recent call last)
〈ipython-input-129-5c41221e3002〉 in()
1 s = '012345'
----> 2 s[3] = 'x'
TypeError: 'str' object does not support item assignment
リストへの要素の追加と要素の削除
リストに対して append メソッドを使用すると要素を末尾に追加することができます.(次の例)
lst = []
lst.append( 0 )
print( lst )
lst.append( 2 )
print( lst )
lst.append( 4 )
print( lst )
実行結果:
[0]
[0, 2]
[0, 2, 4]
この例では,最初に空のリスト [ ] を用意し,それに対して次々と要素を追加しています.(末尾への追加)
末尾ではなく,指定したインデックス位置に要素を追加するには insert メソッドを使用します.
対象リスト.insert( インデックス位置, 要素 )
先の例のリスト lst の途中位置に要素を追加する例を次に示します.
lst.insert(1,'a')
print( lst )
lst.insert(3,'b')
print( lst )
実行結果:
[0, 'a', 2, 4]
[0, 'a', 2, 'b', 4]
リストの指定したインデックス位置の要素を削除するには del 文を実行します.(次の例)
del lst[1]
print( lst )
del lst[2]
print( lst )
実行結果:
[0, 2, 'b', 4]
[0, 2, 4]
指定した値の要素を削除するには remove メソッドを使用します.
対象リスト.remove(要素)
remove メソッドで要素を削除する例を次に示します.
lst = ['a','b','c','b','d']
lst.remove('b')
print( lst )
実行結果:
['a', 'c', 'b', 'd']
注意)同じ値の要素が複数ある場合は最初に現れる1つのみが削除されます.この例ではリストに要素 'b' が2つ含まれていますが,2つ目の 'b' は削除されずに残っています.
リストに対して pop メソッドを実行すると,指定したインデックス位置の要素を取り出して,元のリストから削除します.
対象リスト.pop( インデックス位置 )
pop メソッドを使用した例を次に示します.
lst = [0,1,2]
print( lst.pop(0), lst )
print( lst.pop(0), lst )
print( lst.pop(0), lst )
実行結果:
0 [1, 2]
1 [2]
2 []
リストの先頭の要素が次々と取り出され,最後に空リスト [ ] になっている様子がわかります.
重要)append と pop を組み合わせると,リストでスタックやキューを実現することができます.
■ リストの拡張
リストの末尾に別のリストを追加するには extend メソッドを使用します.
対象リスト.extend( 別のリスト )
extend メソッドを使用する例を次に示します.
lst = [0,1,2]
lst.extend( [3,4,5] )
print( lst )
実行結果:
[0, 1, 2, 3, 4, 5]
リストの連結,繰り返し
文字列の場合と同様に,リストでも「+」による連結と「*」による繰り返しができます.(次の例)
lst1 = ['a','b','c']
lst2 = ['d','e','f']
print( lst1 + lst2 )
print( lst1 * 3 )
実行結果:
['a', 'b', 'c', 'd', 'e', 'f']
['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
要素の探索と含有検査
指定した要素がリストに含まれるかどうかを検査するには in 演算子を使用します.(次の例)
lst = ['a','b','c','d']
print( 'c' in lst )
print( 'x' in lst )
実行結果:
True
False
このように検査結果が真理値として得られます.(通常は if 文などの中で条件式として in 演算子を使用します)
■ 要素のインデクス位置の特定
指定した要素がリスト内のどのインデックス位置にあるかを調べるには index メソッドを使用します.
対象リスト.index( 要素 )
index メソッドを使用する例を次に示します.
lst = ['a','b','c','d']
lst.index('c')
実行結果:
2
リスト lst のインデックス2の位置(先頭から3番目の位置)に要素 'c' があることがわかりました.
次に,リスト中に存在しない要素の位置を index メソッドで調べて見ましょう.(次の例)
lst.index('x')
実行結果:
ValueError Traceback (most recent call last)
〈ipython-input-145-b63e6cf8f3e1〉 in()
----> 1 lst.index('x')
ValueError: 'x' is not in list
このようにエラーとなってしまいます.このような事態を回避するには,その要素が存在するかどうかを if 文などで判定し,存在する場合にのみ index メソッドを実行するか,あるいは適切に例外処理をする必要があります.(例外処理に関しては別の記事で解説します)
要素の順序の整列,反転
リストに対して sort メソッドを実行すると,そのリストの要素の順序が昇順に整列されます.(次の例)
lst = [8,3,2,7,5,6,9,1,4]
lst.sort()
print( lst )
実行結果:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
sort メソッドにキーワード引数 reverse=True を与えると降順に整列されます.(次の例)
lst = [8,3,2,7,5,6,9,1,4]
lst.sort( reverse=True )
print( lst )
実行結果:
[9, 8, 7, 6, 5, 4, 3, 2, 1]
sort メソッドでは対象のリスト自体が整列された形に変更されます.これに対して sorted 関数は,元のリストを変更せずに,整列されたリストを別のものとして作成します.(次の例)
lst = [8,3,2,7,5,6,9,1,4]
lst2 = sorted( lst )
print( lst2 )
print( lst )
実行結果:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[8, 3, 2, 7, 5, 6, 9, 1, 4]
lst を整列したものを別の lst2 として作成しています.(元の lst は変化していません)
■ 要素の順序の反転
リストの要素の順序を反転するには reverse メソッドを使用します.(次の例)
lst = [1, 2, 3, 4, 5, 6, 7, 8, 9]
lst.reverse()
print( lst )
実行結果:
[9, 8, 7, 6, 5, 4, 3, 2, 1]
このように reverse メソッドは対象のリスト自体を逆順にしたものに変更します.これに対して reversed 関数は元のリストを変更することなく,要素の順序を逆転したものを別のものとして作成します.ただし,reversed 関数が作成するものはリストではなくイテレータと呼ばれるオブジェクトです.(次の例)
lst = [1, 2, 3, 4, 5, 6, 7, 8, 9]
lst2 = reversed( lst )
print( lst2 )
実行結果:
〈list_reverseiterator object at 0x7fd166be2828〉
反転結果のイテレータが得られています.イテレータに関しては別の記事で解説しますが,これを list コンストラクタでリストに変換することができます.(次の例)
list( lst2 )
実行結果:
[9, 8, 7, 6, 5, 4, 3, 2, 1]
要素の個数を調べる方法
リストの要素の個数は len 関数で調べることができます.(次の例)
lst = [1, 2, 3, 4, 5, 6, 7, 8, 9]
len( lst )
実行結果:
9
また,指定した要素が何個含まれるかを調べるには count メソッドを使用します.
対象リスト.count( 要素 )
count メソッドを使用する例を次に示します.
lst = ['a','b','a','c','a','d']
print( lst.count('a') )
print( lst.count('e') )
実行結果:
3
0
タプル
リストと性質がよく似たデータ構造にタプルがあります.タプルは要素を丸い括弧 ( ) で括ります.タプルは要素を変更することができない(ミュータブルではない)データ構造で,この様子をイミュータブルであると表現します.
リストを扱う関数などの内,内容を変更しないものは概ねタプルに対しても使用することができます.次の例はタプルの要素をsorted 関数で整列するものです.
t = (9, 8, 7, 6, 5, 4, 3, 2, 1)
print( t )
sorted( t )
実行結果:
(9, 8, 7, 6, 5, 4, 3, 2, 1)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
タプル t の要素の順序が整列されています.ただし,結果はリストの形で得られています.
■ 特殊なタプル
空のタプル ( ) を扱うこともできますが,要素が1個のみのタプルを作成する場合は,記述方法に注意してください.(次の例)
t1 = ()
t2 = ('a')
print( t1 )
print( t2 )
実行結果:
()
a
空のタプルが t1 に与えられています.そして,要素 'a' を1つだけ持つタプルを t2 に作成したように見えますが,この記述では単に値を括る括弧とみなされてしまい,t2 はタプルではなく,ただの文字列 'a' となっています.
要素を1つだけ持つタプルは (要素,) と記述します.(次の例)
t = ('a',)
print( t )
実行結果:
('a',)
タプルはしばしば,括弧を省略して入力できるケースがあります.(次の例)
1,2,3,4
実行結果:
(1, 2, 3, 4)
これは括弧なしで要素のみをコンマで括って書き並べた例ですが,結果としてタプルになっています.
Python3 の基礎 − 超入門・再入門 −