二重の内包

 内包表記が依然として上手く使いこなせない。すぐにforに逃げてしまう。エクセルで使ってたせいか、なんか簡単に思える一方、forで3,4行のものが内包表記では1行で終わってしまうのは素晴らしいと思う。

 最近本を読んでいて知ったのですが、内包表記は二重にも三重にも出来るそうな。これを見たのはeffective pythonだったかもしれないし僕の夢の中だったかもしれない。いや、僕はそんなことも思いもしなかったので後者は過ちである。二重のループを使いたくなることはよくある。しかし、そレが必要な場面を内包表記で乗り切るのは非常にかっこいいように思える。

 というわけで、今回はこんなケースで対応してみた。銀行など代理業者を調べている際にその所属銀行名を調べていたとしよう。

http://www.fsa.go.jp/menkyo/menkyoj/dairi_a.pdf

データを実際に取るのはこちらのサイトのエクセルからだ。

http://www.fsa.go.jp/menkyo/menkyo.html

 残念ながらこのサイトは改行で所属銀行をセルに入れている。これをリスト化しようとすると、一工夫いるのかもしれないなということは分かる。というわけでどうするか、いつもの私ならforで3回位回して、リスト化する。やり方はこんな感じかな。

import pandas as pd
df = pd.read_excel('http://www.fsa.go.jp/menkyo/menkyoj/dairi_a.xls')
df1 = df[3:]

gu = []
for i in df1.index:
    a = df1.loc[i,'k']
    gu.append(a)

gu2 = []
for i in range(len(gu)):
     for k in range(len(gu[i])):
          gu2.append(gu[i][k])

コラムの名前つけを入れるのを忘れたのだけれど、こんな感じだと思う。 しかし、二重の内包を使うとforのところも2行で終わる。

import pandas as pd
df = pd.read_excel('http://www.fsa.go.jp/menkyo/menkyoj/dairi_a.xls')
df1 = df[3:]

a = [df1.loc[i,'k']  for i in df1.index]
b = [a[y][x] for y in range(len(a)) for x in range(len(a[y]))]

注意点としては最初に回したいループを先に、どんどん後付していくということのみ。