リスト(listオブジェクト)は任意の型のデータを要素とするデータ構造で、「[]」で囲んで表現する。要素を変更可能である点がタプルと異なる。listオブジェクトは[]内にその要素を列挙するか、内包表記を使うか、組み込み関数listに反復可能オブジェクトを渡すことで生成できる。
なお、リスト/タプル/辞書/集合の概要については「Pythonの文法、基礎の基礎」を、内包表記については「ジェネレーター式と内包表記を使ってみよう」を参照されたい。以下ではその作成と操作をサンプルコードと共に示す。
l = ['abc', 1, (1, 100)]
print(l) # 出力結果: ['abc', 1, (1, 100)]
print(type(l)) # 出力結果: <class 'list'>
from random import randint # randomモジュールから関数randintをインポート
l = [randint(0, 10) for x in range(10)] # リスト内包表記によるリスト作成
print(l) # 出力結果(例): [6, 10, 3, 4, 1, 10, 3, 1, 0, 5]
リストに対しては、文字列/リスト/タプルなどのシーケンス型に共通な処理と、変更可能なシーケンス型に固有の処理を行える(後述)。それ以外に、list型に固有のメソッドとしてsortメソッドがある。これはリストの要素をインプレースに並べ替える破壊的なメソッドである。並べ替えた新しいリストを取得する場合は、組み込み関数sortedを使用する。
以下に簡単な例を示す。
l = ['jpn', 'usa', 'gbr', 'ita', 'esp', 'tha']
m = sorted(l) # lを辞書式順序に並べ替え
print(m) # 出力結果: ['esp', 'gbr', 'ita', 'jpn', 'tha', 'usa']
print(l) # lは変化していない。出力結果: ['jpn', 'usa', 'gbr', 'ita', 'esp', 'tha']
l.sort() # lの内容を辞書式順序に並べ替え
print(l) # 出力結果: ['esp', 'gbr', 'ita', 'jpn', 'tha', 'usa']
sortメソッド/sorted関数には並べ替えのキーとなる関数を与えたり、要素を逆順に並べ替えたりすることも可能だ。以下のリストは乱数を文字列化したものだが、これをsorted関数で並べ替えたところ、辞書式順序に要素が並べ替えられている(サンプルなのでリストを何度も作成し直す必要がないよう、ここでは組み込み関数sortedを使用している)。
from random import randint
l = [str(randint(0, 20)) for x in range(10)]
print(l) # 出力例: ['5', '19', '2', '10', '13', '20', '16', '1', '6', '14']
print(sorted(l)) # 出力例: ['1', '10', '13', '14', '16', '19', '2', '20', '5', '6']
このような場合には、キー関数として組み込み関数intを渡してやると、数値比較が行われて、意図した通りの並べ替えが行われる。
print(sorted(l, key=int)) # 出力例: ['1', '2', '5', '6', '10', '13', '14', '16', '19', '20']
ソートのうまいやり方についてはPythonの公式サイトのドキュメント「ソート HOW TO」を参照のこと。
タプルはリスト同様、任意の型のデータを要素とするが、それらを変更できない点がリストとの大きな違いだ。タプルは一般に「()」で囲んで表記する(ただし、実際にはタプルを生成するのは「,」である)。タプルを作成するには()内に要素を列挙するか、組み込み関数tupleに反復可能オブジェクトを与えるなどの方法がある。
t = (1) # 1つの要素をかっこで囲んだだけではタプルにはならない
print(type(t)) # 出力結果: <class 'int'>
t = (1,) # 1要素のタプルを作成するにはカンマが必要
print(type(t)) # 出力結果: <class 'tuple'>
t = ('abc', 1, (1, 100))
print(t) # 出力結果: ('abc', 1, (1, 100))
from random import randint # randomモジュールからrandint関数をインポート
l = [randint(0, 10) for x in range(10)]
t = tuple(l) # リストからタプルを作成
print(t) # 出力結果: (10, 8, 2, 4, 5, 2, 2, 1, 4, 6)
t = tuple(randint(0, 10) for x in range(10)) # ジェネレーター式からタプルを作成
print(t) # 出力結果: (0, 4, 9, 4, 7, 0, 4, 7, 7, 7)
タプルに対しては、以下で示す文字列/リスト/タプルなどのシーケンス型に共通な処理を行える。
文字列/タプル/リストは共にシーケンス(順序性を持った要素の集合)であり、これらには共通の処理が実装されている。その一方で、文字列とタプルは不変性を持つオブジェクトであり、リストはその要素を変更可能であることから、リストでは他の2つとは異なる操作(要素の追加や削除など)も可能だ。なお、以下では文字列/タプル/リストをまとめて「シーケンス」と記述する。
シーケンスではインデックスを指定して、特定の要素や指定した範囲の要素を取り出せる(後者をスライス/スライシングと呼ぶ)。構文を以下に示す。
インデックス/スライスの指定 | 取り出される範囲 |
---|---|
s[index] | シーケンスsから指定した位置の要素を取り出す |
s[start:end] | start〜endの範囲にある要素を取り出す(endの値の直前の要素まで) |
s[start:end:step] | start〜endの範囲でstepで指定した値ごとに要素を取り出す |
s[start:] | start位置から以降の要素を全て取り出す |
s[start::step] | start位置からstepで指定した値ごとに要素を取り出す |
s[:end:step] | 先頭〜endまでの範囲からstepで指定した値ごとに要素を取り出す |
s[::step] | 先頭からstepで指定した値ごとに要素を取り出す |
s[:] | 全要素の取り出し |
要素の取り出しの構文 |
以下に例を示す。
s = "0123456789" # 文字列
l = list(range(10)) # リスト
print(l) # 出力結果: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
t = tuple(l) # タプル
print(t) # 出力結果: (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
print(s[7]) # 指定した位置の要素を取り出す。出力結果: 7
print(l[2:5]) # 2〜5の範囲のスライスを取り出す。出力結果: [2, 3, 4]
print(t[0:10:2]) # 全範囲から1つおきに要素を取り出す。出力結果: (0, 2, 4, 6, 8)
print(t[::2]) # 全範囲の場合はstartとendは省略可能。出力結果: (0, 2, 4, 6, 8)
print(s[-3:]) # 負値を指定すると末尾からの位置指定。出力結果: 789
print(s[-3:-1]) # 出力結果: 78
シーケンスでは要素の存在確認にはin演算子を使用する。また、組み込み関数lenを使って、要素数(長さ)をチェックできる。また、indexメソッドを使うとシーケンス内から特定の要素の検索を、countメソッドを使うとシーケンス内での特定要素の発生回数を数えられる。min関数/max関数を呼び出すと最小値/最大値が得られる。
操作 | 説明 |
---|---|
target in s target not in s |
シーケンスsに要素が含まれているか(いないか) |
len(s) | 要素数(長さ)のチェック |
s.index(target[, start[, end]]) | シーケンスsの範囲start〜endから要素targetを検索 |
s.count(target) | シーケンスs内で指定した要素targetの発生回数をカウント |
max(s) | 最大値の取得 |
min(s) | 最小値の取得 |
シーケンスsに対する要素の存在確認とチェックの構文 |
以下に例を示す。
s = "".join([chr(randint(0, 25) + ord('a')) for x in range(10)])
print(s) # 適当に作成した文字列。出力結果(例): 'djgdecodwc'
l = ['jpn', 'usa', 'gbr', 'ita', 'esp', 'tha']
t = tuple(l)
print('a' in s) # 文字'a'が文字列sに含まれているか。出力結果: False
print('q' not in s) # 文字'q'が文字列sに含まれていないか。出力結果: True
print(len(l)) # リストの要素数。出力結果: 6
print(len(s)) # 文字列の文字数。出力結果: 10
print(max(t)) # タプルの最大値。出力結果: 'usa'
print(min(l)) # リストの最小値。出力結果: 'esp'
print(s.count('d')) # 文字列sに'd'が何個あるか。出力結果: 3
print(l.index('gbr')) # リストから'gbr'を検索。出力結果: 2
複数のシーケンスがある場合、+演算子でそれらを連結できる。また、*演算子の被演算子にシーケンスと整数値を指定すると、シーケンスを整数倍した新たなシーケンスが得られる。
操作 | 説明 |
---|---|
s1 + s2 | シーケンスs1、s2の連結 |
s * n n * s |
シーケンスsをn回繰り返した新たなシーケンスを作成 |
シーケンスの連結の構文 |
以下に例を示す。
print([1, 2, 3] + [4, 5, 6]) # リストの連結。出力結果: [1, 2, 3, 4, 5, 6]
print("foo" + "bar") # 文字列の連結。出力結果: foobar
print((1, 2, 3) * 2) # (1, 2, 3)を2回繰り返す。出力結果: (1, 2, 3, 1, 2, 3)
リストは要素を変更可能であることから、文字列やタプルとは異なり、要素を追加、削除、変更するための操作が提供されている。以下にリストを操作するメソッドを示す。
操作 | 説明 |
---|---|
l.append(x) | リストlに要素xを追加(xがそのままリストの要素となる) |
l.clear() | リストlの内容を削除 |
l.copy() | リストlの浅いコピーを作成 |
l.extend(iterable) | リストlの内容をiterableの内容で拡張(iterableの要素が個々にリストに追加される) |
l.insert(index, x) | 指定したindexにxを挿入 |
l.pop(index) | 指定したindexの要素を取り出して削除 |
l.remove(x) | 指定した最初のxを削除 |
l.reverse() | リストlを逆順に並べ替える |
リストlの要素を変更するメソッド |
また、文字列/タプル/リストではインデックス位置の要素やスライスを取り出せたが、リストではさらにそれらを変更することも可能だ。以下に上のメソッドと共に幾つかの使用例を示す。appendメソッドとextendメソッドの動作の違いには注意すること。
l = [] # 空リストの作成
l.append(1) # appendメソッドで「1」を追加
l.append([2, 3]) # appendメソッドで「[2, 3]」を追加
print(l) # l[1]の要素が[2,3]というリストになる。出力結果: [1, [2, 3]]
l.extend([4, 5]) # extendメソッドの引数の内容が展開されて追加される
print(l) # 出力結果: [1, [2, 3], 4, 5]
print(l[1:2]) # 出力結果: [[2, 3]]
l[1:2] = (2, 3) # スライスの内容を反復可能オブジェクトの内容で置き換える
print(l) # 出力結果: [1, 2, 3, 4, 5]
l += [6, 7] # +=演算子はextendメソッドと同様に機能する
print(l) # 出力結果: [1, 2, 3, 4, 5, 6, 7]
l.reverse() # 逆順に並べ替え
print(l) # 出力結果: [7, 6, 5, 4, 3, 2, 1]
l.pop() # 末尾の要素を取り出して削除
print(l) # 出力結果: [7, 6, 5, 4, 3, 2]
l.remove(3) # 指定した要素の削除
print(l) # 出力結果: [7, 6, 5, 4, 2]
l.insert(len(l), 0) # リスト末尾に「0」を追加
print(l) # 出力結果: [7, 6, 5, 4, 2, 0]
次ページでは辞書と集合についてまとめる。
Copyright© Digital Advantage Corp. All Rights Reserved.