特集
» 2016年10月28日 05時00分 公開

TensorFlowやChainerに興味があるけど、Python未経験の技術者が最低限知っておいた方がいい基礎文法まとめ特集:タイニーレファレンス(3/6 ページ)

[かわさきしんじ,Insider.NET編集部]

リスト

 リスト(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オブジェクトの作成

 リストに対しては、文字列/リスト/タプルなどのシーケンス型に共通な処理と、変更可能なシーケンス型に固有の処理を行える(後述)。それ以外に、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関数

 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']


ソートのキーとして組み込み関数intを渡す

 ソートのうまいやり方については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.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。