本サイトAIZU ONLINE JUDGE ITP1_8_C へはこちらから
問題:文字のカウント
与えられた英文に含まれる、各アルファベットの数を数えるプログラムを作成して下さい。 なお、小文字と大文字は区別しません。
Input
複数の行にまたがる1つの英文が与えられます。
Output
与えられた英文に含まれる各アルファベットの数を以下に示す形式で出力して下さい:
a : aの個数
b : bの個数
c : cの個数
.
.
z : zの個数
Constraints
- 英文が含む文字の数 < 1200
Sample Input
This is a pen.
Sample Output
a : 1
b : 0
c : 0
d : 0
e : 1
f : 0
g : 0
h : 1
i : 2
j : 0
k : 0
l : 0
m : 0
n : 1
o : 0
p : 1
q : 0
r : 0
s : 2
t : 1
u : 0
v : 0
w : 0
x : 0
y : 0
z : 0
解答例
import sys
texts=sys.stdin.read()
texts=texts.lower()
cnt=[0]*26
letters='abcdefghijklmnopqrstuvwxyz'
for x in texts:
i=0
for y in letters:
if x==y:
cnt[i]+=1
i+=1
for i in range(26):
print(letters[i]+" : "+str(cnt[i]))
解説
以下のように解いていきます。
複数の行にまたがる1つの英文の読み込み
今回は入力が複数行で何行入力されるか不明なので、sys.stdin.read()
を使います。
sys.stdin.read()
の使用にはsysモジュールのインポートする必要があり、import sys
をsys.stdin.read()
の前に記述します。
import sys
texts=sys.stdin.read()
受け取った英文を小文字に変換
ここでは、1.複数の行にまたがる1つの英文の読み込みで受け取った文字列を全て小文字に変換します。
受け取った文字列を全て小文字に変換するために、lowerメソッドを使用します。
lowerメソッドとは
lower メソッドは文字列のすべての文字を小文字に変換した新しい文字列を返します。使い方は次の通りです。
文字列.lower()
実際の使い方は次の通りです。
words = 'AbCdEfG'
print(words.lower())
# 全て小文字に入れ替わる
abcdefg
今回は、受け取った文字列を変数textsに保持、それをlowerメソッドで全て小文字に変換しています。
# 全て小文字に変換する
texts=texts.lower()
アルファベットの数をカウント
まず、カウント用の配列を用意します。アルファベットは26文字なので26個の0が入った配列を作ります。
次に、a~zの26文字を変数に代入します。
そして、for文を2つ用意して、外側のfor文で入力した文字列を回し、内側のfor文でa~zの26文字が入ったリストを回します。入力した文字列の中から取り出した文字が、a~zのどれかに当てはまった場合、カウント用の配列のa~zのアルファベットの番号に+1カウントします。
これを入力した文字分繰り返します。
# カウント用の配列
cnt=[0]*26
# a~zの26文字を用意。これをfor文で回し、一致する文字をカウントする
letters='abcdefghijklmnopqrstuvwxyz'
# 入力した文字を一文字ずつ取り出す
for x in texts:
i=0
# a~zの26文字を一文字ずつ取り出す
for y in letters:
# 入力した文字と一致するときに+1カウントする
if x==y:
cnt[i]+=1
# iをカウントアップ
i+=1
カウント結果の表示
ここでは3.アルファベットの数をカウントで行った文字数カウントの結果を表示します。
まずは、for文のイテラブルにrange(26)を設定し、26回ループを回します。
そして、a~zが入った変数lettersのi番目に、文字数cnt[i]を表示します。
for i in range(26):
# a~zのi番目の文字数cnt[i]を表示
print(letters[i]+" : "+str(cnt[i]))
※サイト内「AIZU ONLINE JUDGE ITP1_3_Aをpythonで解いてみた」の、for文とはに使用方法が書かれておりますのでよかったらご覧ください。
最後に、もう一度プログラムを確認してみましょう。
import sys
texts=sys.stdin.read()
# 全て小文字に変換する
texts=texts.lower()
# カウント用の配列
cnt=[0]*26
# a~zの26文字を用意。これをfor文で回し、一致する文字をカウントする
letters='abcdefghijklmnopqrstuvwxyz'
# 入力した文字を一文字ずつ取り出す
for x in texts:
i=0
# a~zの26文字を一文字ずつ取り出す
for y in letters:
# 入力した文字と一致するときに+1カウントする
if x==y:
cnt[i]+=1
# iをカウントアップ
i+=1
for i in range(26):
# a~zのi番目の文字数cnt[i]を表示
print(letters[i]+" : "+str(cnt[i]))
コメント