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」がコンソールに表示されます。
-
PythonでAの倍数かつ桁の合計がBと等しい最小の正の整数を求める方法
問題の概要 2つの整数 A と B が与えられたとき、「A で割り切れ、かつ各桁の数字の合計が B と等しい」という条件を満たす最小の正の整数 M を求めます。そのような数が存在しない場合は -1 を返します。 例えば、入力が A = 50、B = 2 の場合、出力は 200 となります。200 は 50 で割り切れ、桁の合計も 2 + 0 + 0 = 2 となり、両方の条件を満たす最小の数だからです。 解法のアプローチ:幅優先探索(BFS) この問題は幅優先探索(BFS)を用いることで効率的に解けます。BFS は桁数の少ない数から順に探索を進めるため、最初に見つかった解が必ず最小値になりま
-
Python関数の引数の数を取得する方法【inspectモジュール活用】
Python関数の引数の数を調べるには? たとえば、次のようなスクリプト qux.py があるとします。 #qux.py def aMethod1(arg1, arg2): pass def aMethod2(arg1, arg2, arg3, arg4, arg5): pass このスクリプトの中身が分からない(ソースコードにアクセスできない)場合でも、Pythonの標準ライブラリである inspect モジュールを使えば、関数が受け取る引数の数や名前を簡単に調べることができます。 inspectモジュールで引数の一覧を取得する まず、inspect モジュールをインポー