2018年01月18日

言語処理100本ノックでPython入門 #04 - 辞書型

   このエントリーをはてなブックマークに追加 Clip to Evernote
今日は、言語処理100本ノックの問題04に挑戦です。

■問題
04. 元素記号

"Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."
という文を単語に分解し,1, 5, 6, 7, 8, 9, 15, 16, 19番目の単語は先頭の1文字,それ以外の単語は先頭に2文字を取り出し,取り出した文字列から単語の位置(先頭から何番目の単語か)への連想配列(辞書型もしくはマップ型)を作成せよ.

■書いたコード
import re

text = "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."
array = re.split(r'\s|,|\.', text)
words = [s for s in filter(lambda w: len(w) > 0, array)]
worddict = {}
for i, e in enumerate(words, 1):
    length = 1 if i in [1, 5, 6, 7, 8, 9, 15, 16, 19] else 2
    worddict[e[0:length]] = i
print(worddict.items())

■実行結果
[('Be', 4), ('C', 6), ('B', 5), ('Ca', 20), ('F', 9), ('S', 16), ('H', 1), ('K', 19), ('Al', 13), ('Mi', 12), ('Ne', 10), ('O', 8), ('Li', 3), ('P', 15), ('Si', 14), ('Ar', 18), ('Na', 11), ('N', 7), ('Cl', 17), ('He', 2)]

■今回学んだことなど


今回は、辞書の使い方を学びました。

辞書の初期化
dict = {}  
辞書に値を設定
doct[key] = value
辞書の中身を表示する
print(dict.items())

その他

・for文
for i, e in enumerate(words, 1):
とすれば、enumerateの最後の引数でインデックスの初期値を決められます。


・リストに含まれるかを調べる
num in [1, 5, 6, 7, 8, 9, 15, 16, 19] 

・条件演算子

C#だと、? : 使うけど、pythonだと、次のように書けます。でもちょっと読みにくいです。
len = 1 if i in [1, 5, 6, 7, 8, 9, 15, 16, 19] else 2

・長い文字列を複数行に分けて書く

文字列の初期化で、以下の警告が出ます。
message: 'C0301:Line too long (103/100)'
これを以下のようにバックスラッシュを最後に書くと複数行にかけるので、警告が消えます。
text = "Hi He Lied Because Boron Could Not Oxidize Fluorine. "\
       "New Nations Might Also Sign Peace Security Clause. Arthur King Can."