【Python】タプルのリスト

2023年1月12日

Pythonのタプルのリストの生成や要素の取り出し方、zip関数について解説します。

タプルのリストを生成

コード例

# タプルのリストを生成

old_capital = [
    (694, '藤原京'),
    (710, '平城京'),
    (794, '平安京'),
    ]

print('old_capital       =', old_capital)
print('old_capital[0]    =', old_capital[0])
print('old_capital[1]    =', old_capital[1])
print('old_capital[2]    =', old_capital[2])
print('old_capital[0][0] =', old_capital[0][0])
print('old_capital[0][1] =', old_capital[0][1])
print('old_capital[1][0] =', old_capital[1][0])
print('old_capital[1][1] =', old_capital[1][1])
print('old_capital[2][0] =', old_capital[2][0])
print('old_capital[2][1] =', old_capital[2][1])

実行結果

old_capital       = [(694, '藤原京'), (710, '平城京'), (794, '平安京')]
old_capital[0]    = (694, '藤原京')
old_capital[1]    = (710, '平城京')
old_capital[2]    = (794, '平安京')
old_capital[0][0] = 694
old_capital[0][1] = 藤原京
old_capital[1][0] = 710
old_capital[1][1] = 平城京
old_capital[2][0] = 794
old_capital[2][1] = 平安京

変数old_capitalは要素数3のリストで、各要素は遷都された年と首都名で構成されたタプルです。

各要素としてのタプルにはold_capital[0]、old_capital[1]、old_capital[2]でアクセスできます。

さらにそのタプルは遷都された年(int型)と首都名(str型)の対となっています。

遷都された年や首都名へのアクセスはインデックス演算子[]を二重にした形式で可能なのは2次元リストと同じです。

今回はリストの中にタプルでしたがタプルの中にタプルも同じです。

0 1
0 694 藤原京
1 710 平城京
2 794 平安京

次は特定の要素を取り出すプログラムを考えます。

コード例

# 年号・首都名を取り出す

old_capital = [
    (694, '藤原京'),
    (710, '平城京'),
    (794, '平安京'),
    ]

for i in old_capital:
    print(i[0])

capital = [i[1] for i in old_capital]
print(capital)

実行結果

694
710
794
['藤原京', '平城京', '平安京']

前半のfor文の方では年号を取り出しています。

年号は各タプルのインデックス[0]なので該当する要素をリストから取り出します。

後半のリスト内包表記では首都名を取り出しています。

首都名は各タプルのインデックス[1]なので該当する要素をリストから取り出します。

一般的にはリスト内包表記のほうが使いやすいです。

zip関数

複数のリストやタプルをひとつのオブジェクトにまとめる組込み関数zip関数を使っていきます。

zip関数は同一インデックスの要素を取り出して作られたタプルを要素とするzip型のzipオブジェクトを生成します。

文字ではわかりにくいので実際に使ったほうがわかりやすいです。

コード例

# zip関数によるリストの結合

name = ['ダ・ヴィンチ', 'ゴッホ', 'ピカソ']
masterpiece = ['モナ・リザ', 'ひまわり', 'ゲルニカ']
birth_year = [1452, 1853, 1881]

lst = list(zip(name, masterpiece, birth_year))
print(lst)

実行結果

[('ダ・ヴィンチ', 'モナ・リザ', 1452), ('ゴッホ', 'ひまわり', 1853), ('ピカソ', 'ゲルニカ', 1881)]

nameは画家の名前、masterpieceは代表作、birth_yearは生まれた年をそれぞれ要素とする要素数3のリストです。

表示結果を見ると同一インデックスの要素をタプル化したリストが生成されています。

このように同一インデックスの要素をタプル化してzipオブジェクトを生成することをzip化といいます。

zip化前

0 1 2
name ダ・ヴィンチ ゴッホ ピカソ
master
piece
モナ・リザ ひまわり ゲルニカ
birth
_year
1452 1853 1881

zip化後

0 1 2
0 ダ・ヴィンチ モナ・リザ 1452
1 ゴッホ ひまわり 1853
2 ピカソ ゲルニカ 1881

リストの要素はインデックス0の要素、1の要素、2の要素を取り出してタプル化されています。

別々のリストに格納されていた代表作と生まれた年が画家ごとにまとめられて、

ダ・ヴィンチのデータのタプル、ゴッホのデータのタプル、ピカソのデータのタプルが作られます。

これらのタプルをまとめてzipオブジェクトを作るのがzip化でその型はzipオブジェクト型です。

zipオブジェクト型のままではリストやタプルとして使えないので一般的にlist関数やtuple関数でリストやタプルにします。

もちろん作成されたリストの要素にはインデックス演算子[]でアクセス可能になります。

今回はzip化前のリストの全要素数が同じですが、異なる場合は最も短い要素数の分だけ先頭側から取り出されます。

Python

Posted by ほりえりお