Pythonのススメ5

はじめに

Pythonでプログラムを書くにあたり、文法や言語仕様などの個人的なメモを記載する。
今回のネタはコレクション(リストとタプル)。
コレクションには「リスト(list)」「タプル(tuple)」「辞書(dict)」「集合(set)」が含まれる。

リスト(list)

複数の型のデータをひとまとめにする。
角カッコ[]を使い、含める要素をカンマで区切る。

list = ["hoge", 100, 0.5]

基本的な使い方

結合やスライス等のサンプルプログラム
# リストの中身繰り返し表示
print(list * 3)

# リスト同士の結合
print(list + ["Hello", "Happy", "World"])

# インデクスを指定した要素抽出
elem = list[0]
print(elem)

# スライス
print(list[1:])

# 要素数取得
len = len(list)
print(len)

# 要素の有無
isExist = "hoge" in list
print(isExist)

上記プログラムの実行結果は以下の通り。

['hoge', 100, 0.5, 'hoge', 100, 0.5, 'hoge', 100, 0.5]
['hoge', 100, 0.5, 'Hello', 'Happy', 'World']
hoge
[100, 0.5]
3
True
for文 with リスト
for (変数名) in (リスト):
    # 何かしらの処理

サンプルプログラムは以下の通り。

list = ["hoge", 100, 0.5]
for elem in list:
    print(elem)

実行結果は以下の通り。

hoge
100
0.5
要素の追加

appendメソッドを利用する。

(リスト).append(何かしらの値)

サンプルプログラムを以下に示す。

list = ["hoge", 100, 0.5]
list.append("Hello")

実行結果は以下の通り。

# print(list)  の実行結果
['hoge', 100, 0.5, 'Hello']
リスト内包表記

Pythonの機能の一つで、新しいリストをより高速に、シンプルに生成する技法。
基本的に以下のような構成で記載する。さらにifを組み合わせたテクニックもある。

(変数elemの処理) for (変数elem) in (配列など)

例えば、リスト内の各要素の文字列を出力するプログラムを考える。
通常のfor文を使った表記は以下のようになる。

# 並び順に特に意味はありません。
list = ["Giants", "Tigers", "Carp", "Swallows", "Dragons", "BayStars"]

ret = []
for elem in list:
    ret.append(len(elem))
print(ret)

これを、リスト内包表記を使うと以下のようになる。

ret = [len(elem) for elem in list]
print(ret)

実行結果はともに以下の通り。

[6, 6, 4, 8, 7, 8]

☆リスト内包表記を使うメリット
・処理が速い。
・記載がシンプルになる。

★リスト内包表記を使うデメリット
・それによってかえって記載が複雑になる場合はリスト内包表記は使わない方がよい。
 - これはPythonの「誰がソースコードを読んでも理解できる(理解しやすい)」という方針に反するため。

タプル(tuple)

複数の型のデータをひとまとめにする。
カッコ()を使い、含める要素をカンマで区切る。

tuple = ("hoge", 100, 0.5)

基本的な使い方

結合やスライス等のサンプルプログラム
# タプルの中身繰り返し表示
print(tuple * 3)

# タプル同士の結合
print(tuple + ("Hello", "Happy", "World"))

# インデクスを指定した要素抽出
elem = tuple[0]
print(elem)

# スライス
print(tuple[1:])

# 要素数取得
len = len(tuple)
print(len)

# 要素の有無
isExist = "hoge" in tuple
print(isExist)

上記プログラムの実行結果は以下の通り。

('hoge', 100, 0.5, 'hoge', 100, 0.5, 'hoge', 100, 0.5)
('hoge', 100, 0.5, 'Hello', 'Happy', 'World')
hoge
(100, 0.5)
3
True


リストとの違いは以下の通り。
1.タプルの場合、要素が1つでも、カンマが必要。

tuple = ("Hello",)

2.リストは可変(mutable)だが、タプルは不変(immutable)
・タプルでは、appendメソッド、またはそれに類する破壊的な操作を行うメソッドを使えない。
 - appendを使うということは、対象のオブジェクトを変更するということなので。
 - appendのような操作をするにはタプルの結合により新しいタプルを作る必要がある。

tuple = ("hoge", 100, 0.5)
tuple += ("Hello", "Happy", "World")

・関数の戻り値や不変としたい設定用の値に使える。

for文 with タプル
for (変数名) in (タプル):
    # 何かしらの処理

サンプルプログラムは以下の通り。

tuple = ("hoge", 100, 0.5)
for elem in tuple:
    print(elem)

実行結果は以下の通り。

hoge
100
0.5

終わりに

Pythonのコレクション(リストとタプル)について、サンプルプログラムを交えて記載した。
リストは可変(mutable)なのに対して、タプルは不変(immutable)である。
それゆえ、リストではappendのような、破壊的な操作を行うメソッドを実行できるが、タプルではそれを使えない。
また、リストではリスト内包表記という技法がある。
これを使えばシンプルな記述で、より高速にリストを生成することができる。
今後はコレクション(辞書と集合)などについても記載していく。

参考

リスト内包表記の活用と悪用 - Qiita
Pythonリスト内包表記の使い方 | note.nkmk.me
5. データ構造 — Python 3.6.5 ドキュメント
タプルの連結と繰り返し - タプル - Python入門