2018年02月15日

言語処理100本ノックでPython入門 #13 - zip関数

  
本日は、言語処理100本ノック 2015の問題13に挑戦です。

■ 問題

hightemp.txtは,日本の最高気温の記録を「都道府県」「地点」「℃」「日」のタブ区切り形式で格納したファイルである.以下の処理を行うプログラムを作成し,hightemp.txtを入力ファイルとして実行せよ.さらに,同様の処理をUNIXコマンドでも実行し,プログラムの実行結果を確認せよ.

13. col1.txtとcol2.txtをマージ
12で作ったcol1.txtとcol2.txtを結合し,元のファイルの1列目と2列目をタブ区切りで並べたテキストファイルを作成せよ.確認にはpasteコマンドを用いよ.


■ Pythonのコード
def solve(infile1, infile2, outfile):
    with open(outfile, 'w', encoding='utf8') as fw, \
         open(infile1, 'r', encoding='utf8') as fr1, \
         open(infile2, 'r', encoding='utf8') as fr2:
        for word1, word2 in zip(fr1, fr2):
            fw.write(word1.rstrip() + '\t' + word2)

def main():
    solve('col1.txt', 'col2.txt', 'connected.txt')
    print('end.')

if __name__ == '__main__':
    main()

■ zip関数

調べたら、zip関数がstreamにも使えることがわかりました。
streamに対してzip関数が使えるなんて、うーん、すごいですね。便利すぎます。 C#のLINQのZipメソッドも便利ですが、これに関してはPythonの勝ちですね。

行末の改行除去に、rstrip関数を使っています。C#やってるプログラマーには、改行が自動で除去されないのは本当に不便です。改行除去してくれるオプションを用意してくれていればいいのにと思います。

なお、問題にはファイル名の指定がないので、connected.txtとしました。 


■ Visual Studio CodeでPython環境を切り替える

ところで、PC内に複数のPython環境がある場合、VSCodeはどうやって、それを指定すればいいのかなと疑問だったのですが、ちゃんと公式サイトの以下のページに書いてありました。
https://code.visualstudio.com/docs/python/environments


Command Palette (Ctrl+Shift+P)で、「Python: Select Interpreter」を選べば、一覧が出てくるので、それで選択すればいいみたいです。






※ スクリーンショットは、公式サイトのものです。

anacondaの仮想環境もちゃんと認識してくれるようです。


■ 結果
高知県	江川崎
埼玉県	熊谷
岐阜県	多治見
山形県	山形
山梨県	甲府
和歌山県	かつらぎ
静岡県	天竜
山梨県	勝沼
埼玉県	越谷
群馬県	館林
群馬県	上里見
愛知県	愛西
千葉県	牛久
静岡県	佐久間
愛媛県	宇和島
山形県	酒田
岐阜県	美濃
群馬県	前橋
千葉県	茂原
埼玉県	鳩山
大阪府	豊中
山梨県	大月
山形県	鶴岡
愛知県	名古屋