前提
レンタカー屋さんの予約モデルを作成しています。
顧客が入力した予約・返却時間に、すでに予約が入っている車を除いた車の一覧を表示したいです。
予約が入っている車にも関わらずOutputに表示されてしまうのですが、問題箇所がわからず、質問させていただきます。
Classメソッドを習っていないので、使わず、Dictionaryで対応しています。
またモジュールは datetimeのみという縛りがあります。
初心者で恐縮ですが、何日も考えてもわからず、ご教授頂けますと幸いです。
実現したいこと
ここに実現したいことを箇条書きで書いてください。
- Sedanで、'2022/10/4 09:00' 〜 '2022/10/5 09:00'に予約が入っていない車の一覧を表示する。
発生している問題・エラーメッセージ
入るべきでない車が、Outputに表示される。
該当のソースコード
python
1 2#入力値 3requestcategory = 'Sedan' 4pickdatetime = '2022/10/4 09:00' 5returndatetime = '2022/10/5 09:00' 6 7request_pickuptime = datetime.strptime(pickdatetime,'%Y/%m/%d %H:%M') 8request_returntime = datetime.strptime(returndatetime,'%Y/%m/%d %H:%M') 9 10 11def sort_availablecar(): 12 from datetime import datetime 13 14 with open("carlist.txt", "r") as file: 15 carlist = eval(file.read()) 16 17 with open("customerlist.txt", "r") as file: 18 customerlist = eval(file.read()) 19 20 sorted_carlist = [] 21 22 for d in carlist: 23 if carlist[d]['Category'] == requestcategory and carlist[d]['Status'] == 'Available': 24 for l in customerlist: 25 reservedpickup_str = datetime.strptime(customerlist[l]['Pickupdatetime'] ,'%Y/%m/%d %H:%M:%S') 26 reservedreturn_str = datetime.strptime(customerlist[l]['Returndatetime'] ,'%Y/%m/%d %H:%M:%S') 27 28 if carlist[d]['PlateN'] == customerlist[l]['PlateN'] and reservedpickup_str < request_pickuptime and request_returntime < reservedreturn_str: 29 pass 30 elif carlist[d]['PlateN'] == customerlist[l]['PlateN'] and request_pickuptime < reservedpickup_str and reservedpickup_str < request_returntime and request_returntime < reservedreturn_str : 31 pass 32 elif carlist[d]['PlateN'] == customerlist[l]['PlateN'] and reservedpickup_str < request_pickuptime and request_pickuptime < reservedreturn_str and reservedreturn_str < request_returntime: 33 pass 34 else: 35 sorted_carlist = carlist[d] 36 else: 37 pass 38 39 if sorted_carlist == [] : 40 print("There is no car available for your requested time.") 41 else: 42 print("There is Available car for your request!") 43 return sorted_carlist['PlateN'] 44 45a = sort_availablecar() 46print(a) 47 48#carlist.txt 49{1: {'PlateN': 'SE001A', 'Make': 'Toyota', 'Model': 'Carolla', 'Category': 'Sedan', 'Status': 'Available', 'Outlet': 'OutletA'}, 2: {'PlateN': 'SE002A', 'Make': 'Toyota', 'Model': 'Carolla', 'Category': 'Sedan', 'Status': 'Available', 'Outlet': 'OutletA'}, 3: {'PlateN': 'SE003A', 'Make': 'Toyota', 'Model': 'Carolla', 'Category': 'Sedan', 'Status': 'Maintenance', 'Outlet': 'OutletA'}, 4: {'PlateN': 'SE001B', 'Make': 'Honda', 'Model': 'Civic', 'Category': 'Sedan', 'Status': 'Available', 'Outlet': 'OutletB'}, 5: {'PlateN': 'SE002B', 'Make': 'Honda', 'Model': 'Civic', 'Category': 'Sedan', 'Status': 'Available', 'Outlet': 'OutletB'}, 6: {'PlateN': 'SE003B', 'Make': 'Honda', 'Model': 'Civic', 'Category': 'Sedan', 'Status': 'Maintenance', 'Outlet': 'OutletB'}, 7: {'PlateN': 'SE001C', 'Make': 'Kia', 'Model': 'Cerato', 'Category': 'Sedan', 'Status': 'Available', 'Outlet': 'OutletC'}, 8: {'PlateN': 'SU002C', 'Make': 'Subaru', 'Model': 'Forrester', 'Category': 'SUV', 'Status': 'Available', 'Outlet': 'OutletC'}, 9: {'PlateN': 'MP003C', 'Make': 'Honda', 'Model': 'Odyssey', 'Category': 'MPV', 'Status': 'Available', 'Outlet': 'OutletC'}} 50 51#customerlist.txt 52{1: {'Reservation#': 1, 'PlateN': 'SE001A', 'Name': 'Bob', 'Pickupdatetime': '2022/10/03 09:00:00', 'Returndatetime': '2022/10/05 09:00:00', 'pickoutlet': 'OutletA', 'returnoutlet': 'OutletA'}, 2: {'Reservation#': 2, 'PlateN': 'SU002C', 'Name': 'Charles', 'Pickupdatetime': '2022/10/03 09:00:00', 'Returndatetime': '2022/10/05 16:00:00', 'pickoutlet': 'OutletC', 'returnoutlet': 'OutletC'}, 3: {'Reservation#': 3, 'PlateN': 'SU002C', 'Name': 'Edward', 'Pickupdatetime': '2022/10/05 18:00:00', 'Returndatetime': '2022/10/07 18:00:00', 'pickoutlet': 'OutletA', 'returnoutlet': 'OutletA'}, 4: {'Reservation#': 4, 'PlateN': 'SE001B', 'Name': 'Felix', 'Pickupdatetime': '2022/10/03 09:00:00', 'Returndatetime': '2022/10/04 09:00:00', 'pickoutlet': 'OutletB', 'returnoutlet': 'OutletB'}} 53 54
> 入るべきでない車が、Outputに表示される。
具体的にはどのような表示になっていて、どうなれば正解なのでしょうか?
早速コメントいただき、ありがとうございます。すでにcustomerlist.txtにBookingが入っているものと&別の'Category':のものを除いて、以下のようなリストを返したいです。(carlist.txtと同じ構造です)。
正しい
{{'PlateN': 'SE002A', 'Make': 'Toyota', 'Model': 'Carolla', 'Category': 'Sedan', 'Status': 'Available', 'Outlet': 'OutletA'},
{'PlateN': 'SE003A', 'Make': 'Toyota', 'Model': 'Carolla', 'Category': 'Sedan', 'Status': 'Maintenance', 'Outlet': 'OutletA'},
{'PlateN': 'SE002B', 'Make': 'Honda', 'Model': 'Civic', 'Category': 'Sedan', 'Status': 'Available', 'Outlet': 'OutletB'},
{'PlateN': 'SE003B', 'Make': 'Honda', 'Model': 'Civic', 'Category': 'Sedan', 'Status': 'Maintenance', 'Outlet': 'OutletB'},
{'PlateN': 'SE001C', 'Make': 'Kia', 'Model': 'Cerato', 'Category': 'Sedan', 'Status': 'Available', 'Outlet': 'OutletC'}}
エラー ('Category': 'Sedan',が全て表示されている)
{{'PlateN': 'SE001A', 'Make': 'Toyota', 'Model': 'Carolla', 'Category': 'Sedan', 'Status': 'Available', 'Outlet': 'OutletA'},
{'PlateN': 'SE002A', 'Make': 'Toyota', 'Model': 'Carolla', 'Category': 'Sedan', 'Status': 'Available', 'Outlet': 'OutletA'},
{'PlateN': 'SE003A', 'Make': 'Toyota', 'Model': 'Carolla', 'Category': 'Sedan', 'Status': 'Maintenance', 'Outlet': 'OutletA'},
{'PlateN': 'SE001B', 'Make': 'Honda', 'Model': 'Civic', 'Category': 'Sedan', 'Status': 'Available', 'Outlet': 'OutletB'},
{'PlateN': 'SE002B', 'Make': 'Honda', 'Model': 'Civic', 'Category': 'Sedan', 'Status': 'Available', 'Outlet': 'OutletB'},
{'PlateN': 'SE003B', 'Make': 'Honda', 'Model': 'Civic', 'Category': 'Sedan', 'Status': 'Maintenance', 'Outlet': 'OutletB'},
{'PlateN': 'SE001C', 'Make': 'Kia', 'Model': 'Cerato', 'Category': 'Sedan', 'Status': 'Available', 'Outlet': 'OutletC'}}
そこらへんの説明は質問文を編集して追記するようにしてください
質問のコードを試したところ「There is Available car for your request!
SE001C」が表示されました。これは正しい挙動でしょうか?

「すでにcustomerlist.txtにBookingが入っているものと&別の'Category':のものを除いて、以下のようなリストを返したい」
→コードを読むに、Status が Available 以外のものは除外するという意図があるようにも見えます。
SE003A と SE003B は Status:Maintenance なので、期待する動作としてはこの2つを除いた
['SE002A', 'SE002B', 'SE001C']
の3件の情報出力されることではないでしょうか。