リスト内包表記
前回、gTTS(Google Text-to-Speech)を使って音声読み上げする方法を解説しました。
今回はリスト内包表記で複数のリストを同時に作成する方法を解説していきます。
まずはリスト内包表記のおさらいから。
例えばfor文を使って繰り返し処理をしたものをリストに格納するこんなプログラムがあったとします。
list1 = []
for i in range(10):
list1.append(i)
print(list1)
実行結果
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
これをリスト内包表記を使うとこのように1行で書くことができます。
list2 = [i for i in range(10)]
print(list2)
実行結果
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1行で書くことでそのリストがどのようなリストか分かりやすくなります。
今回はこのリスト内包表記で複数のリストを同時に作成する方法を色々と試していきます。
二つ並べて書く方法
一番単純なのが、「,(カンマ)」で区切って、二つ並べて書く方法です。
list3, list4 = [i for i in range(10)], [j for j in range(20)]
print(list3)
print(list4)
実行結果
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
”同時に”ではないのですが、お互いのリストに含まれる値が関連性がない場合はこの方法になるでしょう。
値が関連がある場合
二つのリストに入れる値が関連している場合、例えば一方がもう一方の2倍といった場合はリスト内包表記の中で「.append」を使うことで同時に複数のリストに格納することができます。
list4 = []; list5 = []
[(list4.append(i), list5.append(i*2)) for i in range(10)]
print(list4)
print(list5)
実行結果
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
ここでリストに格納している部分の「(list4.append(i), list5.append(i*2))」がタプルとなっていますが、リストでも大丈夫です。
list6 = []; list7 = []
[[list6.append(i), list7.append(i*2)] for i in range(10)]
print(list6)
print(list7)
実行結果
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
ただしタプルにもリストにもなっていない場合はエラーになるので注意です。
list8 = []; list9 = []
[list8.append(i), list9.append(i*2) for i in range(10)]
print(list8)
print(list9)
実行結果
Input In [26]
[list8.append(i), list9.append(i*2) for i in range(10)]
^
SyntaxError: did you forget parentheses around the comprehension target?
Zip関数を使う
リスト内包表記でもfor文と同様にZip関数を使うこともできます。
list10 = []; list11 = []
[(list10.append(i), list11.append(j)) for i, j in zip(range(10), range(20,30))]
print(list10)
print(list11)
実行結果
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[20, 21, 22, 23, 24, 25, 26, 27, 28, 29]
enumerate関数を使う
またリスト内包表記ではfor文と同様にenumerate関数を使うことができます。
list12 = []; list13 = []
[(list12.append(i), list13.append(j)) for i, j in enumerate(range(20, 30))]
print(list12)
print(list13)
実行結果
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[20, 21, 22, 23, 24, 25, 26, 27, 28, 29]
最初はよく分からなくて避けていたリスト内包表記ですが、使えるようになってくると可読性よく書けるので便利です。
ただ結構奥が深く、今回のように色々な書き方ができるので今後も色々と試していきたいなと思います。
次回はrandomモジュールの重みありランダムの取得の方法を解説していきます。
ではでは今回はこんな感じで。
コメント