Pythonで単語リストのスコアを計算するプログラムの書き方
配列の中にいくつかの単語が入っているとします。これらの単語はすべて小文字で構成されています。ここで、次のルールに基づいて単語セット全体の合計スコアを求めることを考えましょう。
- 母音は [a, e, i, o, u, y] の6文字とみなします。
- ある単語に含まれる母音の数が偶数の場合、その単語のスコアは 2 になります。
- それ以外(母音の数が奇数)の場合、その単語のスコアは 1 になります。
- 単語セット全体のスコアは、各単語のスコアをすべて足し合わせた値となります。
具体例
たとえば、入力が次のような単語リストだったとします。
words = ["programming", "science", "python", "website", "sky"]
この場合の出力は 6 になります。理由は以下の通りです。
- 「programming」:母音が3個(o, a, i)→ スコア 1
- 「science」:母音が3個(i, e, e)→ スコア 1
- 「python」:母音が2個(o, y)→ スコア 2
- 「website」:母音が3個(e, i, e)→ スコア 1
- 「sky」:母音が1個(y)→ スコア 1
したがって、1 + 1 + 2 + 1 + 1 = 6 という結果になります。
アルゴリズムの手順
この問題を解くためには、以下の手順に従います。
- 合計スコアを格納する変数
scoreを 0 で初期化します。 - リスト内の各単語について、以下の処理を繰り返します。
- 母音のカウント用変数
num_vowelsを 0 で初期化します。 - 単語内の各文字を順番に調べ、母音であれば
num_vowelsを 1 増やします。 num_vowelsが偶数ならscoreに 2 を加算し、奇数なら 1 を加算します。
- 母音のカウント用変数
- 最終的な
scoreを返します。
実装例
それでは、実際のPythonコードを見てみましょう。
def solve(words):
score = 0
for word in words:
num_vowels = 0
for letter in word:
if letter in ['a', 'e', 'i', 'o', 'u', 'y']:
num_vowels += 1
if num_vowels % 2 == 0:
score += 2
else:
score += 1
return score
words = ["programming", "science", "python", "website", "sky"]
print(solve(words))入力
["programming", "science", "python", "website", "sky"]
出力
6
補足:より簡潔な書き方
Pythonでは、ジェネレータ式を使うことで上記のコードをさらに簡潔に書くこともできます。
def solve(words):
vowels = set('aeiouy')
return sum(2 if sum(c in vowels for c in word) % 2 == 0 else 1 for word in words)このように、母音を集合(set)として定義しておくと判定が高速になり、コードも読みやすくなります。計算量は単語の総文字数に比例する O(N) となり、非常に効率的です。
-
【Python入門】2つの文字列から珍しい単語(ユニークな単語)を見つけるプログラムの作り方
はじめに この記事では、以下の問題文に対する解決方法を、実際のコード例とともにわかりやすく解説します。 問題文 2つの文字列が与えられたとき、その中から「珍しい単語」(どちらか一方の文字列にしか出現しない単語)をすべて抽出することを目標とします。両方の文字列に共通して含まれる単語は除外します。 解決のアプローチ ここでは辞書(dict)を使った出現回数のカウント方式を採用します。手順は次のとおりです。 空の辞書を用意する 各文字列をsplit()で単語ごとに分割する 各単語の出現回数を辞書に記録する 出現回数がちょうど1回の単語だけを結果として返す 実装例 # 珍しい単語を見つける関
-
PythonでリストからN個の最大要素を取得する方法
整数のリストが与えられたとき、その中からN個の大きな要素を取り出して新しいリストとして返すのが、ここでの課題です。本記事では、基本的なループ処理による方法から、Python標準ライブラリを活用した効率的な方法まで、サンプルコードとともに解説します。 例 入力 : [40, 5, 10, 20, 9] N = 2 出力 : [40, 20] アルゴリズム 整数のリストと、取得する要素数Nを受け取ります。 N回のループを実行します。 各ループでリスト内の最大値を探し、新しいリストに格納すると同時に元のリストから削除します。 実装コード def Nnumberele(list1, N):