こん○●は!PHPerです。
さて、さっそく今日もCheckIOの第4問に挑戦します。
The Most Wanted Letter もっともお尋ね者の文字を探せ!
英語の文字と句読点が含まれる文字列があります。もっとに、文字列の中で頻度が高い文字を探してください。文字は小文字で返してください。頻度を調べるにあたって、大文字小文字は関係ありません。ただし、句読点、数字、ホワイトスペースは無視してください。英語の文字のみです。
もし、同じ頻度で使われている2つ以上の文字がある場合は、アルファベットの順が若い文字を返してください。
例:
checkio("Hello World!") == "l"
checkio("How do you do?") == "o"
checkio("One") == "e"
checkio("Oops!") == "o"
checkio("AAaooo!!!!") == "a"
checkio("abe") == "a"
まずは、解答案をまとめてみます。
(1) 文字列を1文字ずつイテレーションする
(2) 文字列が英文字以外であれば何もしない。
(3) 小文字に変換して、その文字のカウントをする。
(4) その際にもっとも高頻度に出現する文字のカウント数(a)をメモする
(5) 最後に、(a)と同じ回数出現する文字を検索する(複数見つかる場合も)
(6) 見つかった文字をソートして一番アルファベット順で先頭の文字を返す
なんか、(4)(5)(6)がダサイですね~。「頻度がもっとも高くて、アルファベット順がもっとも先頭」のものを一発で検索したいです。下記のように変えてみます。
(4) 最後に、出現頻度表をイテレーションする。
(5) 出現頻度が最も高いものを探す。同じだった場合はアルファベット順が先頭のものを優先する。
ということで、方針が決まったので、今回の処理に必要なPythonの言語やライブラリの仕様を検索してまとめてみました。
str.lower() 全ての大小文字の区別のある文字 [4] が小文字に変換された、文字列のコピーを返します。
str.isalpha() 文字列中の全ての文字が英字で、かつ 1 文字以上あるなら真を、そうでなければ偽を返します。4.10. マッピング型 dict マッピング (mapping) オブジェクトは、ハッシュ可能 (hashable) な値を任意のオブジェクトに対応付けます。
# {"one": 1, "two": 2, "three": 3} に等しい辞書
d = {'one': 1, 'two': 2, 'three': 3}
# d のキー key の項目を返します。
d[key]
# d[key] に value を設定します。
d[key] = value
# 辞書の項目 ((key, value) 対) の新しいビューを返します
for (k,v) in d.items()
さて、レッツゴー!プログラミング!
今回は、一発で通りました~!キモチイ~!
def checkio(str): d = {} for letter in str: if letter.isalpha(): lower = letter.lower() if lower in d: d[lower] += 1 else: d[lower] = 0 find = False max = 0 for item in d.items(): letter,count = item if max < count: find = letter max = count elif max == count and (not find or letter < find): find = letter return find