Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで郵便番号の形式を検証するプログラムの書き方

郵便番号の有効性を判定する条件

文字列として与えられた郵便番号が有効かどうかを判定するプログラムを考えてみましょう。有効な郵便番号と認められるためには、次の2つの条件を満たす必要があります。

  • 範囲の条件:100000以上999999以下(両端を含む)の6桁の数値であること。言い換えると、先頭の桁が「0」であってはならず、桁数はちょうど6桁でなければなりません。
  • 反復パターンの条件:「1つおきに同じ数字が並ぶ」交互反復ペアが2組以上含まれていないこと。

ここでいう「交互反復ペア」とは、インデックスiとi+2の位置にある数字が一致している組み合わせのことです。たとえば「121212」のように、同じ数字が1つおきに繰り返されるパターンが該当します。

たとえば、入力が s = "700035" の場合を考えてみます。この値は100000〜999999の範囲内に収まっており、交互反復ペアも許容範囲(1組以下)にとどまっているため、出力は True になります。

解法の手順

この問題は、次のような流れで解くことができます。

  1. 変数nに文字列sの長さを格納します。
  2. 交互反復ペアを数えるためのカウンターnbを0で初期化します。
  3. 「すべての文字が数字であるか」を記録するフラグokをTrueで初期化します。
  4. 各文字を先頭から順に調べ、数字以外が混ざっていればokをFalseに更新します。
  5. i番目とi+2番目の文字を比較し、一致するごとにnbを1ずつ増やします。
  6. 最後に「okがTrue」「桁数が6」「先頭が'0'ではない」「nbが2未満」の4条件をすべて満たす場合のみTrueを返し、それ以外はFalseを返します。

実装例

理解を深めるために、実際のPythonコードを見てみましょう。

def solve(s):
    n = len(s)
    nb = 0
    ok = True
    for i in range(n):
        ok = ok and s[i].isdigit()
    for i in range(n - 2):
        nb += s[i] == s[i + 2]

    return ok and n == 6 and s[0] != '0' and nb < 2

s = "700035"
print(solve(s))

入力

"700035"

出力

True

コードのポイント

この実装では、Pythonらしい書き方を2点活用しています。

  • ブール値の加算:s[i] == s[i + 2] は比較結果としてTrueまたはFalseを返しますが、nb += の形で足し合わせると、Trueは1、Falseは0として扱われます。これにより、条件に合うペアの個数を簡潔に数えられます。
  • 条件の一括返却:最後のreturn文では、複数の検証項目をand演算子で連結しています。すべての条件が揃ったときだけTrueになるため、if文を何重にも書く必要がありません。

また、isdigit()メソッドを使うことで、文字列中に数字以外の文字(記号やアルファベットなど)が含まれるケースも自動的に除外できる点も見逃せません。このように、範囲・桁数・文字種・反復パターンという複数の観点を組み合わせることで、堅牢な郵便番号バリデーションを実現できます。

  1. Pythonで数独グリッドの有効性を検証するプログラムの実装方法

    数独グリッドの有効性検証とは? ここでは、9×9の数独(スドク)グリッドが有効(valid)であるかどうかを判定するプログラムを扱います。検証の対象となるのは、すでに埋められているセルだけであり、次のルールに従ってチェックを行います。 行のルール:各行には、1〜9の数字が重複することなく含まれていること。 列のルール:各列にも、1〜9の数字が重複することなく含まれていること。 ブロックのルール:グリッド内の9つの3×3サブボックス(ブロック)のそれぞれにも、1〜9の数字が重複せずに含まれていること。 例として、次のような数独グリッドを考えてみます。 このグリッドは有効です。 解法のアプ

  2. Pythonでカレンダーを作る方法!calendarモジュールの基本と使い方を解説

    Pythonには、カレンダーを扱うためのcalendarという標準モジュールが組み込まれています。この記事では、calendarモジュールの基本的な使い方について解説していきます。calendarモジュールでは、1週間は月曜日から始まり日曜日に終わります。また、このモジュールはグレゴリオ暦(西暦)に準拠しています。それでは、calendarモジュールの便利なメソッドをいくつか見ていきましょう。年間カレンダーを取得する特定の年のカレンダー全体を取得したい場合は、calendar.calendar(year)クラスのインスタンスを作成し、それを出力します。以下に具体例を示します。コード例# cal