2018年03月01日

言語処理100本ノックでPython入門 #19 - 辞書のソート

  
言語処理100本ノック 2015の第2章最後の問題です。

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

19. 各行の1コラム目の文字列の出現頻度を求め,出現頻度の高い順に並べる
各行の1列目の文字列の出現頻度を求め,その高い順に並べて表示せよ.確認にはcut, uniq, sortコマンドを用いよ.

■ Pythonのコード
def appearanceRate(filename):
    prefDict = {}
    with open(filename, 'r', encoding='utf8') as fin:
        for line in fin:
            pref = line.split()[0]
            if pref in prefDict:
                prefDict[pref] += 1
            else:
                prefDict[pref] = 1
    return sorted(prefDict.items(), key=lambda x: x[1], reverse=True)

def main(): lines = appearanceRate('hightemp.txt') for k, _ in lines: print(k)
if __name__ == '__main__': main()

■ 辞書の操作と並び替え

今回も辞書と並び替えの問題ですね。 辞書のキーに1列目の文字列、辞書の値にその出現回数を記憶しています。 これを sortedでソートします。
key=lambda x: x[1]
出現回数を並び替えのキーにしています。

xを辞書と仮定すると、
x[0] : Key
x[1] : Value
でアクセスできます。


辞書にキーが存在するか

in キーワードを使って辞書にキーが存在するかを調べられます。

prefDict = {}
if pref in prefDict:
    …

逆順にソート


reverse引数にTrueを渡してやれば、逆順にソートできます。
return sorted(prefDict.items(), key=lambda x: x[1], reverse=True)
`x[1]`で、辞書に格納された要素(value)を取り出しています。

もちろんこの記法は、sortの時だけではなく、どこでも利用できます。dic[0]がキー、dic[1]で値を取り出せます。 for文でも以下のように使えます。
for k, v in dic:
    print(k, v)
実に面白いです。


■ 結果
山形県
埼玉県
群馬県
山梨県
愛知県
静岡県
千葉県
岐阜県
大阪府
和歌山県
愛媛県
高知県