組み込み関数を使わずに大文字・小文字をカウントするPythonプログラム
この記事では、文字列に含まれる大文字と小文字の数を数える問題を、組み込みの文字判定メソッドに頼らずに解くための考え方と実装方法を解説します。
問題の概要
文字列が入力として与えられたとき、その中に含まれる大文字の数と小文字の数をそれぞれ求める必要があります。
ここでは、isupper() や islower() のような文字判定メソッドは使わず、組み込み関数 ord() を利用して各文字のASCII値を調べることで判定を行います。
ASCII値による判定の考え方
ASCIIコードでは、英字は次のような範囲に割り当てられています。
- 小文字(a〜z):97〜122
- 大文字(A〜Z):65〜90
そこで、大文字用と小文字用の2つのカウンターを0で初期化し、入力文字列を先頭から順に走査しながら各文字のASCII値をチェックし、条件に一致した側のカウンターを1ずつ増やしていきます。
実装例
def upperlower(string):
upper = 0
lower = 0
for i in range(len(string)):
# 小文字の場合
if (ord(string[i]) >= 97 and
ord(string[i]) <= 122):
lower += 1
# 大文字の場合
elif (ord(string[i]) >= 65 and
ord(string[i]) <= 90):
upper += 1
print('Lower case characters = %s' % lower,
'Upper case characters = %s' % upper)
# ドライバーコード
string = 'Tutorialspoint'
upperlower(string)
出力結果
Lower case characters = 13 Upper case characters = 1
入力文字列「Tutorialspoint」には小文字が13個、大文字(先頭の「T」)が1個含まれているため、上記のような結果が出力されます。
なお、このプログラムではすべての変数と関数が、下図のようにグローバルスコープで宣言されています。

補足:別のアプローチとの比較
実際の開発現場では、string.isupper() や string.islower() を使えばより簡潔に書けますが、この手法には次のようなメリットがあります。
- ASCIIコードの仕組みを理解できる
- 判定ロジックを自分で制御できる(例:特定の記号や数字の扱いを自由に変更可能)
- 言語仕様に依存しない汎用的な考え方を身につけられる
まとめ
この記事では、組み込みの文字判定メソッドを使用せず、ord() で取得したASCII値をもとに、文字列内の大文字・小文字の数をカウントする方法を学びました。時間計算量は文字列の長さを n とすると O(n)、空間計算量は O(1) で効率的に処理できます。
-
連続する「1」を含まないバイナリ文字列の数を数えるPythonプログラム
この記事では、「連続する1が存在しないバイナリ文字列の総数を求める」という問題の解き方について、Pythonでの実装例を交えながら詳しく解説します。 問題文 問題: 正の整数 N が与えられます。このとき、長さ N のバイナリ文字列(0と1のみで構成される文字列)のうち、連続する「1」が一切含まれないものの総数を求めてください。 例えば N = 3 の場合、有効な文字列は「000」「001」「010」「100」「101」の5つとなり、「011」「110」「111」は連続する1を含むため除外されます。 アプローチ:動的計画法 この問題は動的計画法(DP)を使うことで効率的に解けます。各桁の状態を
-
組み込み関数を使わずに大文字・小文字をカウントするPythonプログラム
この記事では、文字列に含まれる大文字と小文字の数を数える問題を、組み込みの文字判定メソッドに頼らずに解くための考え方と実装方法を解説します。 問題の概要 文字列が入力として与えられたとき、その中に含まれる大文字の数と小文字の数をそれぞれ求める必要があります。 ここでは、isupper() や islower() のような文字判定メソッドは使わず、組み込み関数 ord() を利用して各文字のASCII値を調べることで判定を行います。 ASCII値による判定の考え方 ASCIIコードでは、英字は次のような範囲に割り当てられています。 小文字(a〜z):97〜122 大文字(A〜Z):65〜90