「for文で複数の配列の要素をまとめて取り出す場合どの様にしていますか?」
例えば、最初に配列の要素の数を取得して、それをカウンタにしてfor文を回し、変数で受け取った数値を、配列のインデックに指定する方法でしょうか?
list_a = ["a" , "b" ,"c" ]
list_b = ["A" , "B" ,"C" ]
for i in range(len(list_a)):
print(list_a[i] ,list_b[i])
もちろん、これでも”複数の配列の要素を取得する”目的は果たせます。
しかし、わざわざ一方の配列の要素数を取得する方法は、段取りとして美しく無いですし、要素の数が違う場合は、バグの原因にもなります。
Python3には、複数の配列を並列処理できる簡単な方法があります。
■複数の配列をまとめて処理できる関数
zip関数
この関数を使うと、上記の例の様に最初に配列の要素の数を取得する必要が無い為、もっとシンプルな書き方か可能になります。
本記事では、Pythonで、複数の配列をまとめてfor文処理できるzip関数の使い方を紹介します。
参考:https://docs.python.org/ja/3/library/functions.html#zip
|
Python 3:zip関数の基本動作
zip関数は、複数の配列を並列に反復処理し、それぞれから1つの要素を持つタプルをまとめたリストを取得できます。
zip関数に2つの配列を指定。そしてlist関数でリスト化。
list_a = ["a" , "b" ,"c" ]
list_b = ["A" , "B" ,"C" ]
print(zip(list_a , list_b))
print(list(zip(list_a , list_b)))
2つの配列それぞれの要素をタプルをまとめたリストが返されました。
<zip object at 0x7f799598c2c0>
[('a', 'A'), ('b', 'B'), ('c', 'C')]
|
for文で複数の配列から同時に要素を取り出す
zip関数はfor文で利用するとより効果を発揮します。
では、zip関数の基本動作を踏まえて、for文で処理して見ましょう。
list_a = ["a" , "b" ,"c" ]
list_b = ["A" , "B" ,"C" ]
for value in zip(list_a , list_b):
print(value)
zip関数で2つの配列から取り出され、まとめられたタプルが変数[value]に代入され、順番に出力されました。
('a', 'A')
('b', 'B')
('c', 'C')
それぞれの変数に代入する
前の例では、変数[value] 1つに、2つの配列から取り出された要素がまとめられたタプルが代入されました。
代入する変数を要素の数に合わせて指定すれば、タプルにまとめられた要素をそれぞれ分けて取り出す事ができます。
配列の要素を、それぞれ分けて取り出したいので、配列の数だけ変数を用意しました。
list_a = ["a" , "b" ,"c" ]
list_b = ["A" , "B" ,"C" ]
for small_text , large_text in zip(list_a , list_b): #list_a の要素は small_text , list_b の要素は large_text に代入
print(small_text , large_text)
タプル内の要素がそれぞれ変数に代入され、出力されました。
a A
b B
c C
3個以上の配列でも可能
zip関数で処理できる配列は、3個以上の配列でも大丈夫です。
また、zip関数に指定する配列はリスト「[, , ,]」とタプル「(, , ,)」が混ざっていても問題ありません。
2つのリストと、1つのタプルをzip関数にし、for文処理で取り出します。
list_a = ["a" , "b" ,"c" ]
list_b = ["A" , "B" ,"C" ]
tuple = (1 , 2 , 3 )
for small_text , large_text, number in zip(list_a , list_b , tuple):
print(small_text , large_text, number)
指定した3つの配列から1つずつ要素が取り出されました。
a A 1
b B 2
c C 3
複数の文字列から一文字ずつ文字を取り出す
ここまで、配列の要素をzip関数で取得する方法を紹介してきましたが、zip関数で処理できるのは、配列だけではありません。
文字列も、配列と同じ様に処理できます。
string_hiragana = "あいうえお"
string_katakana = "アイウエオ"
for hiragana , katakana in zip(string_hiragana , string_katakana ):
print(hiragana , katakana)
2つの文字列を、zip関数に指定して、for文で処理すると、文字列から1つずつ順番に文字が取り出されました。
あ ア
い イ
う ウ
え エ
お オ
|
配列の長さが異なる場合
zip関数は、指定した複数の配列の要素数が異なる場合、少ない(短い)方を優先します。
取得される要素数は、少ない(短い)の数で終了し、多い方の余った要素は無視されます。
list_a = ["a" , "b" ,"c" ] #要素の数 3
list_b = ["A" , "B" ,"C" , "D" ,"E"] #要素の数 5
for small_text , large_text in zip(list_a , list_b):
print(small_text , large_text)
短い方の配列の要素数だけ出力され、長い方の配列で余った要素は出力されません。
a A
b B
c C
配列が長い方を優先したい場合
zip関数は、配列の要素数が少ない(短い)方を優先してしまいますが、時として長い方に合わせたい場合もあります。
そのような場合は、標準ライブラリ itertoolsモジュール の
zip_longest関数
を使うと、長い方の配列を優先できます。
from itertools import zip_longest
list_a = ["a" , "b" ,"c" ] #要素の数 3
list_b = ["A" , "B" ,"C" , "D" ,"E"] #要素の数 5
for small_text , large_text in zip_longest(list_a , list_b):
print(small_text , large_text)
長い方の配列の要素数が優先され、全ての要素が出力されました。
短い方の配列に要素が無い箇所は、「None」が出力されます。
a A
b B
c C
None D
None E
■引数fillvalueを指定するとその値で埋められる
zip_longest関数で長い方の配列を優先して出力すると、短い方の配列に要素が無い箇所には、「None」が出力されました。
「None」以外の値を出力したい場合は、 zip_longest関数に引数[fillvalue]を指定すると、任意の値が出力できます。
from itertools import zip_longest
list_a = ["a" , "b" ,"c" ] #要素の数 3
list_b = ["A" , "B" ,"C" , "D" ,"E"] #要素の数 5
for small_text , large_text in zip_longest(list_a , list_b ,fillvalue = "-"): #引数[fillvalue]に「"-"」を指定しました。
print(small_text , large_text)
要素が無い箇所が「None」に変わって、「-」が出力されました。
a A
b B
c C
- D
- E
|
まとめ :Python 3で複数の配列をまとめてfor文処理する場合はzip関数
Python3で、複数の配列をまとめてfor文処理できるzip関数の使い方を紹介しました。
zip関数を使うと複数の配列を並列に反復処理する事ができます。
list_a = ["a" , "b" ,"c" ]
list_b = ["A" , "B" ,"C" ]
for small_text , large_text in zip(list_a , list_b):
print(small_text , large_text)
Pythonには便利な関数がいろいろあります。
同じ実行結果だけを求めるだけなら、それらの関数を使う必要は無いと思いますが、保守管理を考慮すると、きれいなコードで見やすい方が良いのは当然。
本記事で紹介した関数を知っていると、コーディングの労力にも違いを感じると思うので、ぜひ試してみてください。
|
自宅からでもWeb制作・プログラミング・アプリ開発などが習得できるさまざまなコースをラインナップ。
非エンジニアでスキルを磨きたい方から、フリーランス、就職/転職を目指す方まで、専属のメンターがサポート。
最近は副業ブームもあり「 はじめての副業コース 」が人気です。
|
|
BTOパソコンの草分け的ブランドFRONTIER(フロンティア) 3DCG/動画編集/ゲーム用途に合わせてCPUやGPUなどパーツを自由に選べてコスパにもこだわる方にオススメ。 |
|
|
|
|
|