ブログ


スパイシー技術メモ


CheckIOに挑戦 Pythonのハッシュ型を学ぶ

CATEGORY: CheckIOPythonプログラム

こん○●は!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






プレスリリース

人気ブログ記事

採用情報

最新ブログ記事








ページの先頭へ