Leetcodeをやっていたときに、zip(*list)というよく分からないコードが正解コードに組み込まれていた。
理解を深めるために解説する。
list = ["abc","def","ghi"]
print(zip(*list))
>>>
>>>
>>>
Output:[('a', 'd', 'g'), ('b', 'e', 'h'), ('c', 'f', 'i')]
まず、zip( )というのは、リスト内の要素を囲うことができる。
アスタリスクを外して、zip(list)をprintしてみよう。
list = ["abc","def","ghi"]
print(zip(list))
>>>
>>>
>>>
Output:[('abc',), ('def',), ('ghi',)]
0番目 1番目 2番目
次に、アスタリスクをつけてzip(*list)に戻すと、
list = ["abc","def","ghi"]
print(zip(*list))
>>>
>>>
>>>
Output:[('a', 'd', 'g'), ('b', 'e', 'h'), ('c', 'f', 'i')]
何番目: 0,0 1,0 2,0 0,1 1,1 2,1 0,2 1,2 2,2
要は、アスタリスクが無ければzip( )本来の働きをする。リスト内の0,1,2,…番目が( )に囲われる。
list = ["abc","def","ghi"]
Output:[('abc',), ('def',), ('ghi',)]
(list[0],list[1],list[2]の順に並んでいる)
しかし、アスタリスクが付くと、リスト内の"全要素の0,1,2,…番目"が同時に( )に囲われる。
list = ["abc","def","ghi"]
Output:[('a', 'd', 'g'), ('b', 'e', 'h'), ('c', 'f', 'i')]
(list[0][0],list[1][0],list[2][0]の順に並んでいる)
なぜ、アスタリスクが付くとlist[0][0]になるのかというと、
zip(*list) == zip(list[0],list[1],list[2])
と、(*list)の中身は(list[0],list[1],list[2])と同じだからである。
もっと詳しく書くと、
1 : zip(list) == (list[0]),(lsit[1]),(list[2])
2 : zip(list[0],list[1],list[2]) == ((list[0]),(lsit[1]),(list[2])) * ((list[0]),(lsit[1]),(list[2]))
== (list[0][0],list[1][0],list[2][0]),(list[0][1],list[1][1],list[2][1]),(list[0][2],list[1][2],list[2][2])
1はただzip( )がlistの並び順に( )で囲っているだけ。
2は、zip( )がlistの並び順を出して、更にそれにlistの並び順を掛け算(数学でいう展開)している。
最終的に分かったことは、「このアスタリスクなんだ????」と思っていたけれど、ただzip()に掛け算しているだけだった。