昨日(というか今日)書いた記事(https://qiita.com/k0gane_p/items/7dc1a013005c3884b9d1 )に「リファクタリングしよう」というコメントがあった。
実はリファクタリングという言葉をそもそも知らなかったので調べたところざっくりいうと「いろいろ工夫して綺麗にしよう!」という意味らしい。同じような構文を変数としてまとめたりだとか使う文法を変えてみたりだとか...
ちなみに昨日書いたのがこれ
count.py
import sys
word = sys.stdin.read()
print("aは " + str(word.count('a')) + " 回")
print("bは " + str(word.count('b')) + " 回")
print("cは " + str(word.count('c')) + " 回")
print("dは " + str(word.count('d')) + " 回")
print("eは " + str(word.count('e')) + " 回")
print("fは " + str(word.count('f')) + " 回")
print("gは " + str(word.count('g')) + " 回")
print("hは " + str(word.count('h')) + " 回")
print("iは " + str(word.count('i')) + " 回")
print("jは " + str(word.count('j')) + " 回")
print("kは " + str(word.count('k')) + " 回")
print("lは " + str(word.count('l')) + " 回")
print("mは " + str(word.count('m')) + " 回")
print("nは " + str(word.count('n')) + " 回")
print("oは " + str(word.count('o')) + " 回")
print("pは " + str(word.count('p')) + " 回")
print("qは " + str(word.count('q')) + " 回")
print("rは " + str(word.count('e')) + " 回")
print("sは " + str(word.count('s')) + " 回")
print("tは " + str(word.count('t')) + " 回")
print("uは " + str(word.count('u')) + " 回")
print("vは " + str(word.count('v')) + " 回")
print("wは " + str(word.count('w')) + " 回")
print("xは " + str(word.count('x')) + " 回")
print("yは " + str(word.count('y')) + " 回")
print("zは " + str(word.count('z')) + " 回")
print("合計" + str(len(word)) + "文字")
コピペが大変だった。a~zまでの文字をカウントしたかったので作ったが、カウント対象の文字以外が全く同じなのでまとめられないか考えたところ次の記事が出てきた。
これによると、アルファベットやひらがなも数字に変換してfor文でまとめられるらしい、知らなかった。これは便利なので使う以外ないと思ってリファクタリングしたものがこれ(+昨日のだと大文字が認識されないのでそれも修正した)
count1.py
import sys
word = sys.stdin.read()
word.lower()
for i in range(97, 123):
print( chr(i)+ "は " + str(word.count(chr(i))) + " 回")
print("合計" + str(len(word)) + "文字")
これを実行すると
Hello World
I study python
abcdefghijklmnopqrstuvwxyz
^Z
aは 1 回
bは 1 回
cは 1 回
dは 3 回
eは 2 回
fは 1 回
gは 1 回
hは 2 回
iは 1 回
jは 1 回
kは 1 回
lは 4 回
mは 1 回
nは 2 回
oは 4 回
pは 1 回
qは 1 回
rは 2 回
sは 2 回
tは 3 回
uは 2 回
vは 1 回
wは 1 回
xは 1 回
yは 3 回
zは 1 回
合計54文字
という感じでうまく出力できた。更に出力を見やすくするために辞書にまとめた。
count2.py
import sys
word = sys.stdin.read()
word.lower()
letter = {}
for i in range(97, 123):
letter[chr(i)] = word.count(chr(i))
letter = sorted(letter.items())
print(letter)
print(len(word))
これにより
Hello World
I study Python
abcdefghijklnmopqrstuvwxyz
^Z
[('a', 1), ('b', 1), ('c', 1), ('d', 3), ('e', 2), ('f', 1), ('g', 1), ('h', 2), ('i', 1), ('j', 1), ('k', 1), ('l', 4), ('m', 1), ('n', 2), ('o', 4), ('p', 1), ('q', 1), ('r', 2), ('s', 2), ('t', 3), ('u', 2), ('v', 1), ('w', 1), ('x', 1), ('y', 3), ('z', 1)]
54
こうなった、大分見やすくなったのではないかなと思う。
## わかったこと
- コーディング後のリファクタリングの大切さ(競プロでも応用できそう)
- アルファベットやひらがなでも数字に変換することでfor文が使える
- 辞書をソートするとリストになる