LoginSignup
0
0

More than 1 year has passed since last update.

zip(*list)の解説

Posted at

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()に掛け算しているだけだった。

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0