LoginSignup
3
2

More than 5 years have passed since last update.

昨日のクソコードをリファクタリングしてみた

Posted at

昨日(というか今日)書いた記事(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までの文字をカウントしたかったので作ったが、カウント対象の文字以外が全く同じなのでまとめられないか考えたところ次の記事が出てきた。

[python] いろいろな文字種のリストを作成

これによると、アルファベットやひらがなも数字に変換して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文が使える
  • 辞書をソートするとリストになる
3
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2