環境は、MacBook-Pro, Python 3.7.3 です。
練習題材として「入力された英単語(診療科)の文字数を全てカウントしていく方法」のプログラミングコードの実装を行いたいと思います。
以下が仕様になります。
- 診療科を表す英単語を格納するリストを作成する。
- アルファベットの小文字をキーとしてまた値を0として辞書を作成する。
- inputで診療科目の英単語を入力していく。
- リターンキーが入力されたところで、英単語の入力を終了する。
- 入力された英単語の小文字を1文字ずつ数を数えていく。
では早速見ていきましょう。
実際のプログラミング
アルファベットをカウントする辞書を作成する。
簡単な方法であれば、alphabet_code
を辞書として作成し、辞書の中に dict.framekeys()
を使用する事で、辞書に格納されている全てのキーに対して同じ値(0
) を初期値として設定する事ができます。
辞書機能の使い方については以下の記事を参照にしてください。
【python】辞書の作り方【基本から応用まで】
続きを見る
In[]
1 2 3 4 5 | alphabet_code = {} alphabet_code = dict.fromkeys(list("abcdefghijklmnopqrstuvwz"), 0) words = [] {'a': 0, 'b': 0, 'c': 0, 'd': 0, 'e': 0, 'f': 0, 'g': 0, 'h': 0, 'i': 0, 'j': 0, 'k': 0, 'l': 0, 'm': 0, 'n': 0, o': 0, 'p': 0, 'q': 0, 'r': 0, 's': 0, 't': 0, 'u': 0, 'v': 0, 'w': 0, 'x': 0, 'y': 0, 'z': 0} |
または、アルファベット a
〜 z
がUnicode 上で連続であることを利用し辞書を作ります。
Unicodeは以下を参照にしてください。Unicodeとは世界の言語をコードとして並べたものです。
» Unicode一覧
ここで、chr()
, ord()
についてもまとめておきましょう。
chr()
: Unicode コードポイントが整数 i である文字を表す文字列を返します。ord()
: Unicode 文字に対し、その文字の Unicode コードポイントを表す整数を返します。chr()
とord()
については以下の組み込み関数を参照してください。
>> 組込み関数-python
1 2 3 4 5 6 7 | alphabet_code = {} alphabet_code = {chr(alphabet_code): 0 for alphabet_code in range(ord('a'), ord('z') + 1)} print(alphabet_code) words = [] {'a': 0, 'b': 0, 'c': 0, 'd': 0, 'e': 0, 'f': 0, 'g': 0, 'h': 0, 'i': 0, 'j': 0, 'k': 0, 'l': 0, 'm': 0, 'n': 0, 'o': 0, 'p': 0, 'q': 0, 'r': 0, 's': 0, 't': 0, 'u': 0, 'v': 0, 'w': 0, 'x': 0, 'y': 0, 'z': 0} |
診療科の英単語一覧の入力を受け付ける。
ここで、while
構文を利用して、診療科目を入力していき、何も入力せずリターンキーを入力したところで break
で 抜け出す仕組みを作ります。
ここでfor文とwhile文の違いの復習です。
for文は回数を指定して、指定した回数のループが完了すればループを抜けます。
一方while文は、条件を指定して、その条件がFalseになればループを抜けます。つまり条件がTrueの間、ループ処理を続けるのがwhile文です。関連記事
【Python】while文の使い方について【繰り返し構文の基本】
続きを見る
以上を利用して、診療科目の英単語一覧の入力を受け付けるコードを作って行きたいと思います。
1 2 3 4 5 6 | while True: word = input("診療科目を入力してください") if word == "": break words.append(word) print(words) |
入力された診療科目の単語の各アルファベットの出現回数を数える。
for文を利用して入力された診療科目の単語の各アルファベットの出現回数を数えるコードを記入します。
ここでは for文
を駆使してコードを作成します。
words
は word
のリスト、word
は各診療科目の単語、letter
は各診療科目の単語を構成する英文字を現しています。
for文の使い方に関しては以下を参照にしてください。
続きを見る【Python】for文の使い方について
更にfor
文の中でも alphabet_code.key()
で辞書である alphabet_code
に格納されているキーの一覧を参照している事も留意が必要です。
メソッドの key()
については以下の記事を参照にしてください。
【python】辞書の作り方【基本から応用まで】
続きを見る
1 2 3 4 5 6 7 8 | for word in words: for letter in word: if letter in alphabet_code.keys(): #alphabet_code が持つキーの一覧を参照 alphabet_code[letter] += 1 print(alphabet_code) {'a': 1, 'b': 1, 'c': 0, 'd': 1, 'e': 2, 'f': 0, 'g': 4, 'h': 0, 'i': 0, 'j': 0, 'k': 0, 'l': 2, 'm': 1, 'n': 1, 'o': 5, 'p': 0, 'q': 0, 'r': 4, 's': 1, 't': 1, 'u': 2, 'v': 0, 'w': 0, 'x': 0, 'y': 4, 'z': 0} |
また、非常に重要なポイントですが、alphabet_code[letter] += 1
とする事で、対象key
である letter
の value
に対して +1 することができます。
そうする事で、英文字がカウントされていくわけです。
単語一覧をソートする。
次にリストであるwords
に入っている文字をソートしていきます。
ソートの仕方については以下を参照にしましょう。
>> Pythonでリストをソートするsortとsortedの違い
1 2 3 4 5 | words.sort() # リストである words に入っている文字をソートする。 print(words) ['dermatology', 'obgyn', 'surgery', 'urology'] |
ソートする事で、words
に入っている単語をアルファベット順に並べる事ができます。
結果を表示する。
最後に結果を表示させます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | for letter, count in alphabet_code.items(): print('{} が {} 個ありました。'.format(letter, count)) a が 1 個ありました。 b が 1 個ありました。 d が 1 個ありました。 e が 2 個ありました。 g が 4 個ありました。 l が 2 個ありました。 m が 1 個ありました。 n が 1 個ありました。 o が 5 個ありました。 r が 4 個ありました。 s が 1 個ありました。 t が 1 個ありました。 u が 2 個ありました。 y が 4 個ありました。 Process exited with code: 0 |
for letter, count in alphabet_code.items()
に関しては items()
のメソッドを使用する事で、格納されている要素のキーと値に対してforループ処理を行います。以下を参照にしてください。
>> Pythonの辞書(dict)のforループ処理
また、for letter, count in alphabet_code.items():
と言ったような、for文と辞書とメソッドの items() を組み合わせる方法については是非とも習得しておきましょう。以下のサイトを参照にしてください。
>> python dict(辞書) keys, values items について
まとめ|辞書の使い方の復習
最終的なコードは次の様になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | alphabet_code = {} alphabet_code = {chr(alphabet_code): 0 for alphabet_code in range(ord('a'), ord('z') + 1)} print(alphabet_code) words = [] while True: word = input("診療科目を入力してください") if word == "": break words.append(word) print(words) for word in words: for letter in word: if letter in alphabet_code.keys(): #alphabet_code が持つキーの一覧を参照 alphabet_code[letter] += 1 print(alphabet_code) words.sort() #wordsのリストに入っている文字をソートする。 print(words) # ['apple', 'banana', 'orange'] for letter, count in alphabet_code.items(): #items(): 各要素のキーと値に対してforループ処理を行う。 if count > 0: print('{} が {} 個ありました。'.format(letter, count)) |
出力結果は次の様になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | {'a': 0, 'b': 0, 'c': 0, 'd': 0, 'e': 0, 'f': 0, 'g': 0, 'h': 0, 'i': 0, 'j': 0, 'k': 0, 'l': 0, 'm': 0, 'n': 0, 'o': 0, 'p': 0, 'q': 0, 'r': 0, 's': 0, 't': 0, 'u': 0, 'v': 0, 'w': 0, 'x': 0, 'y': 0, 'z': 0} 診療科目を入力してくださいobgyn 診療科目を入力してくださいsurgery 診療科目を入力してくださいurology 診療科目を入力してくださいdermatology 診療科目を入力してください ['obgyn', 'surgery', 'urology', 'dermatology'] {'a': 1, 'b': 1, 'c': 0, 'd': 1, 'e': 2, 'f': 0, 'g': 4, 'h': 0, 'i': 0, 'j': 0, 'k': 0, 'l': 2, 'm': 1, 'n': 1, 'o': 5, 'p': 0, 'q': 0, 'r': 4, 's': 1, 't': 1, 'u': 2, 'v': 0, 'w': 0, 'x': 0, 'y': 4, 'z': 0} ['dermatology', 'obgyn', 'surgery', 'urology'] a が 1 個ありました。 b が 1 個ありました。 d が 1 個ありました。 e が 2 個ありました。 g が 4 個ありました。 l が 2 個ありました。 m が 1 個ありました。 n が 1 個ありました。 o が 5 個ありました。 r が 4 個ありました。 s が 1 個ありました。 t が 1 個ありました。 u が 2 個ありました。 y が 4 個ありました。 Process exited with code: 0 |
今回の問題を解くためには、まず辞書の機能をきちんと使用できるかどうか、while ループが使用できるかどうかがキモになります。
この問題を解くために必要な知識をまとめておきます。
ポイントとなる知識
- 辞書の作り方の基本的な理解
- Unicode の
chr()
とord()
の理解 while
文とbreak
の使い方の理解for loop
の理解[/box]この問題を通して復習して頂ければ幸いです。