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

Pythonで不明な数字を置き換えて得られる最新の有効時刻を求める方法

文字列形式の時刻データに含まれる不明な桁(「?」)を置き換えることで表現できる、最も遅い有効な時刻を求めたいケースがあります。本記事では、時刻文字列内の未知・非表示の桁を検出し、その位置(インデックス)に応じて適切な値へ置き換えるPythonの実装方法を解説します。

サンプルコード

以下は実際の実装例です。

def find_latest_time(my_time):
   my_time = list(my_time)
   for i in range(len(my_time)):
      if my_time[i] == "?":
         if i == 0: my_time[i] = "2" if my_time[i+1] in "?0123" else "1"
         elif i == 1: my_time[i] = "3" if my_time[0] == "2" else "9"
         elif i == 3: my_time[i] = "5"
         else: my_time[i] = "9"
   print("".join(my_time))

my_str = '0?:?3'
print("The time is :")
print(my_str)
print("The latest valid time is : ")
find_latest_time(my_str)

出力結果

The time is :
0?:?3
The latest valid time is :
09:53

コードの解説

  • まず、「find_latest_time」という名前の関数を定義し、時刻文字列を引数として受け取ります。

  • 受け取った文字列は list() 関数でリストに変換されます。これにより、各桁を個別に書き換えられるようになります。

  • forループでリストを反復処理しながら、「?」(不明な値)が含まれているかどうかを確認します。

  • インデックス0(時の十の位)の場合:隣の文字(インデックス1)が「?」「0」「1」「2」「3」のいずれかであれば「2」を、それ以外なら「1」を設定します。これは24時間制では時の十の位が最大「2」であるためです。

  • インデックス1(時の一の位)の場合:直前の文字(インデックス0)が「2」であれば「3」(23時までしか表現できないため)、それ以外なら「9」を設定します。

  • インデックス3(分の十の位)の場合:「5」を設定します。分の十の位は最大「5」までしか取れないためです。

  • 上記以外の位置(分の一の位)の場合:「9」を設定して、可能な限り遅い時刻にします。

  • すべての置き換えが完了したら、join() メソッドでリストを再び文字列に連結して表示します。

  • 関数の外側では、サンプルの時刻文字列「0?:?3」を定義してコンソールに出力し、その値を引数として関数を呼び出します。

  • その結果、不明な桁を最大値に置き換えた最新の有効時刻「09:53」がコンソールに表示されます。


  1. PythonでAの倍数かつ桁の合計がBと等しい最小の正の整数を求める方法

    問題の概要 2つの整数 A と B が与えられたとき、「A で割り切れ、かつ各桁の数字の合計が B と等しい」という条件を満たす最小の正の整数 M を求めます。そのような数が存在しない場合は -1 を返します。 例えば、入力が A = 50、B = 2 の場合、出力は 200 となります。200 は 50 で割り切れ、桁の合計も 2 + 0 + 0 = 2 となり、両方の条件を満たす最小の数だからです。 解法のアプローチ:幅優先探索(BFS) この問題は幅優先探索(BFS)を用いることで効率的に解けます。BFS は桁数の少ない数から順に探索を進めるため、最初に見つかった解が必ず最小値になりま

  2. Python関数の引数の数を取得する方法【inspectモジュール活用】

    Python関数の引数の数を調べるには? たとえば、次のようなスクリプト qux.py があるとします。 #qux.py def aMethod1(arg1, arg2): pass def aMethod2(arg1, arg2, arg3, arg4, arg5): pass このスクリプトの中身が分からない(ソースコードにアクセスできない)場合でも、Pythonの標準ライブラリである inspect モジュールを使えば、関数が受け取る引数の数や名前を簡単に調べることができます。 inspectモジュールで引数の一覧を取得する まず、inspect モジュールをインポー