👩‍💻

言語処理100本ノック 2020 (Rev 2) 第1章: 準備運動 04. 元素記号

2023/01/06に公開約1,600字

問題

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文字を取り出し,取り出した文字列から単語の位置(先頭から何番目の単語か)への連想配列(辞書型もしくはマップ型)を作成せよ.

solution04.py
# (1) コンマ(,)、ピリオド(.)を置換する
# (2) 文を単語に分割する
# (3) 単語の順番情報を取得し、順番にあわせて処理をする

def extract_chars(index, word):
    # 1, 5, 6, 7, 8, 9, 15, 16, 19番目の単語は先頭の1文字を取り出す
    if index in [1, 5, 6, 7, 8, 9, 15, 16, 19]:
        return (index, word[0])
    # それ以外の単語は先頭の2文字を取り出す
    else:
        return (index, word[:2])

original_text = 'Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can.'
replaced_text = original_text.replace('.', '').replace(',', '')
ans = [extract_chars(index, word) for index, word in enumerate(replaced_text.split(), start = 1)]
print(dict(ans))
output
{1: 'H', 2: 'He', 3: 'Li', 4: 'Be', 5: 'B', 6: 'C', 7: 'N', 8: 'O', 9: 'F', 10: 'Ne', 11: 'Na', 12: 'Mi', 13: 'Al', 14: 'Si', 15: 'P', 16: 'S', 17: 'Cl', 18: 'Ar', 19: 'K', 20: 'Ca'}

この問題では、各単語の先頭の1文字もしくは2文字を取り出す処理をします。

03. 円周率で登場したreplace()split()を利用して単語を分割します。

次に、各単語の順番情報を取得するためにenumerate(リスト)を利用します。第2引数として「1」(もしくは、「start = 1」)を与えることで、インデックスを0ではなく1から始めるようにしています。

最後に、辞書型のデータに変換するために、タプルのリストにdict()を適用しました。

https://github.com/kurokawa5/nlp100_2020/blob/main/chapter01/solution04.py

参考記事

第1章: 準備運動
Python, enumerateの使い方: リストの要素とインデックスを取得

Discussion

ログインするとコメントできます