Windows
python3
言語処理100本ノック

はじめに

ここ最近質量スペクトル(mass spectrum)のフィッティングをpythonで書き続けていて、言語処理100本ノックをできていなかったので久しぶりの投稿です。出来は、ひどいですが、まあ動くので...

誰かが、コードの質は気にするな!早くかければいいんだ!みたいなことを言っていたような気がするので...

参考になるコメントいただけると助かります:relaxed:

内包表記やmapなどまだまだ自分のものになっていません...

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

出力結果

0 H
1 He
2 Li
3 Be
4 B
5 C
6 N
7 O
8 F
9 Ne
10 Na
11 Mi
12 Al
13 Si
14 P
15 S
16 Cl
17 Ar
18 K
19 Ca
04knock.py
st0="Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."

words=st0.split()

i=0


for (i,x) in enumerate(words):
 if i==0 or i==4 or i==5 or i==6 or i==7 or i==8 or i==14 or i==15 or i==18:
  print(i,x[0:1])
 else:
  print(i,x[0:2])

これで、うまくいきました。問題文の意味が分からなくて少し戸惑いましたが、@segavvyさんのサイトを参考にしたらenumerateというものを知りました。
https://qiita.com/segavvy/items/4e592dea2f828e5385ff

enumerateの意味は「数え上げる」、「列挙する」という意味。インデックスとともにリストを簡単に作れちゃいます。

もっと早く知りたかった...


コメントで指摘していただき、連想配列というものを理解していなかったこと、上のコードは配列すら作っていなかったことに気づいて書き直しました。
出力結果

{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'}
04knock.py
st0="Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."

words=st0.split()

i=0
dic={}


for (i,x) in enumerate(words):
 if i==0 or i==4 or i==5 or i==6 or i==7 or i==8 or i==14 or i==15 or i==18:
  dic[i+1]=x[0:1]
 else:
  dic[i+1]=x[0:2]

print(dic)

これが正しいのかはわかってないのですが、リストと違ってインデックス指定で代入する形で書いています。

リストと連想配列の違いはおそらく、連想配列がvalueを要素として持ち、連想配列はkeyとvalueの両方を要素に持つということだと思います

再度訂正
この投稿にリンクさせていただいてる方からコメントで指摘していただき、問題の意図とずれていたため再度訂正です。

出力結果

{'H': 1, 'He': 2, 'Li': 3, 'Be': 4, 'B': 5, 'C': 6, 'N': 7, 'O': 8, 'F': 9, 'Ne': 10, 'Na': 11, 'Mi': 12, 'Al': 13, 'Si': 14, 'P': 15, 'S': 16, 'Cl': 17, 'Ar': 18, 'K': 19, 'Ca': 20}
04knock.py
st0="Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."

words=st0.split()

i=0
dic={}


for (i,x) in enumerate(words):
 if i==0 or i==4 or i==5 or i==6 or i==7 or i==8 or i==14 or i==15 or i==18:
  dic[x[0:1]]=i+1
 else:
  dic[x[0:2]]=i+1

print(dic)

変更箇所はif文の連想配列の指定する方に文字を、代入する方に数字を入れ替えました。 これは、かなり新鮮です。初めてこんなことをしました。
連想配列、使い道はまだ考え付きませんが今後、使えるときに使っていきたいです。

今回の投稿は出来が良くなかったです、次からは自分のコードをよく見てから投稿していきたいです。