質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.02%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

受付中

レンタカー屋さんの予約一覧を参照し、該当時間に予約されていない車の一覧を作成する

emitaso
emitaso

総合スコア1

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

3回答

1グッド

0クリップ

509閲覧

投稿2022/10/21 16:54

編集2022/10/21 17:35

前提

レンタカー屋さんの予約モデルを作成しています。
顧客が入力した予約・返却時間に、すでに予約が入っている車を除いた車の一覧を表示したいです。
予約が入っている車にも関わらず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
Cocode👏を押しています

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

meg_

2022/10/21 17:19

> 入るべきでない車が、Outputに表示される。 具体的にはどのような表示になっていて、どうなれば正解なのでしょうか?
emitaso

2022/10/21 17:38

早速コメントいただき、ありがとうございます。すでに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'}}
y_waiwai

2022/10/21 22:20

そこらへんの説明は質問文を編集して追記するようにしてください
meg_

2022/10/22 01:49

質問のコードを試したところ「There is Available car for your request! SE001C」が表示されました。これは正しい挙動でしょうか?
qnoir

2022/11/20 02:35 編集

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

回答3

0

問題個所の指摘ではなくて恐縮ですが、、、
処理毎に関数に分けてみるのもいい手ですよ。
関数名がコメント代わりになって、処理を理解しやすくなるかと思います。

それと、「PEP8: Pythonコードのスタイルガイド」に沿って、import文はファイルの先頭に書きましょう。

python

1from datetime import datetime 2 3def load_cars(): 4 return { 5 1: {'PlateN': 'SE001A', 'Make': 'Toyota', 'Model': 'Carolla', 'Category': 'Sedan', 'Status': 'Available', 'Outlet': 'OutletA'}, 6 2: {'PlateN': 'SE002A', 'Make': 'Toyota', 'Model': 'Carolla', 'Category': 'Sedan', 'Status': 'Available', 'Outlet': 'OutletA'}, 7 3: {'PlateN': 'SE003A', 'Make': 'Toyota', 'Model': 'Carolla', 'Category': 'Sedan', 'Status': 'Maintenance', 'Outlet': 'OutletA'}, 8 4: {'PlateN': 'SE001B', 'Make': 'Honda', 'Model': 'Civic', 'Category': 'Sedan', 'Status': 'Available', 'Outlet': 'OutletB'}, 9 5: {'PlateN': 'SE002B', 'Make': 'Honda', 'Model': 'Civic', 'Category': 'Sedan', 'Status': 'Available', 'Outlet': 'OutletB'}, 10 6: {'PlateN': 'SE003B', 'Make': 'Honda', 'Model': 'Civic', 'Category': 'Sedan', 'Status': 'Maintenance', 'Outlet': 'OutletB'}, 11 7: {'PlateN': 'SE001C', 'Make': 'Kia', 'Model': 'Cerato', 'Category': 'Sedan', 'Status': 'Available', 'Outlet': 'OutletC'}, 12 8: {'PlateN': 'SU002C', 'Make': 'Subaru', 'Model': 'Forrester', 'Category': 'SUV', 'Status': 'Available', 'Outlet': 'OutletC'}, 13 9: {'PlateN': 'MP003C', 'Make': 'Honda', 'Model': 'Odyssey', 'Category': 'MPV', 'Status': 'Available', 'Outlet': 'OutletC'}, 14 }.values() 15 16 17def load_customers(): 18 return { 19 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'}, 20 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'}, 21 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'}, 22 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'}, 23 }.values() 24 25 26def to_datetime(text): 27 return datetime.strptime(text, '%Y/%m/%d %H:%M:%S') 28 29 30def category_cars(cars, category): 31 return [car 32 for car in cars 33 if car['Status'] == 'Available' 34 if car['Category'] == category] 35 36 37def is_reserved(customer, request_pickup, request_return): 38 reserved_pickup = to_datetime(customer['Pickupdatetime']) 39 reserved_return = to_datetime(customer['Returndatetime']) 40 return (request_pickup <= reserved_return and 41 reserved_pickup <= request_return) 42 43 44def reserved_plate_numbers(customers, request_pickup, request_return): 45 return {customer['PlateN'] 46 for customer in customers 47 if is_reserved(customer, request_pickup, request_return)} 48 49 50def reservable_cars(cars, reserved_numbers): 51 return [car 52 for car in cars 53 if car['PlateN'] not in reserved_numbers] 54 55 56def main(): 57 request_pickup = to_datetime('2022/10/4 09:00:00') 58 request_return = to_datetime('2022/10/5 09:00:00') 59 60 customers = load_customers() 61 reserved = reserved_plate_numbers(customers, request_pickup, request_return) 62 63 cars = load_cars() 64 cars = category_cars(cars, 'Sedan') 65 cars = reservable_cars(cars, reserved) 66 if cars: 67 print("There is Available car for your request!") 68 for car in cars: 69 print(car['PlateN']) 70 else: 71 print("There is no car available for your requested time.") 72 73 74if __name__ == '__main__': 75 main()

投稿2022/10/22 11:54

shiracamus

総合スコア5394

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

0

最初にCategoryとStatusがユーザー要望に一致する車リストを作成して、その中から予約済で貸し出せない車を除外するコードにしました。
ループ回数が増えるためデータ数が増えると遅くなりますが、分かりやすさを優先しました。

from datetime import datetime #入力値 requestcategory = 'Sedan' pickdatetime = '2022/10/4 09:00' returndatetime = '2022/10/5 09:00' request_pickuptime = datetime.strptime(pickdatetime,'%Y/%m/%d %H:%M') request_returntime = datetime.strptime(returndatetime,'%Y/%m/%d %H:%M') def sort_availablecar(): from datetime import datetime with open("carlist.txt", "r") as file: carlist = eval(file.read()) with open("customerlist.txt", "r") as file: customerlist = eval(file.read()) request_carlist = [] for d in carlist: if carlist[d]['Category'] == requestcategory and carlist[d]['Status'] == 'Available': request_carlist.append(d) reserved_carlist = [] for d in request_carlist: for l in customerlist: reservedpickup_str = datetime.strptime(customerlist[l]['Pickupdatetime'] ,'%Y/%m/%d %H:%M:%S') reservedreturn_str = datetime.strptime(customerlist[l]['Returndatetime'] ,'%Y/%m/%d %H:%M:%S') if carlist[d]['PlateN'] == customerlist[l]['PlateN']: if request_pickuptime < reservedpickup_str and reservedreturn_str < request_returntime: reserved_carlist.append(d) break elif request_pickuptime < reservedreturn_str: reserved_carlist.append(d) break elif request_returntime > reservedreturn_str: reserved_carlist.append(d) break reserved_carlist = list(set(reserved_carlist)) available_carlist = [] for i in request_carlist: if not i in reserved_carlist: available_carlist.append(carlist[i]) if available_carlist == [] : print("There is no car available for your requested time.") else: print("There is Available car for your request!") return available_carlist a = sort_availablecar() print(a) # There is Available car for your request! [{'PlateN': 'SE002A', 'Make': 'Toyota', 'Model': 'Carolla', 'Category': 'Sedan', 'Status': 'Available', 'Outlet': 'OutletA'}, {'PlateN': 'SE002B', 'Make': 'Honda', 'Model': 'Civic', 'Category': 'Sedan', 'Status': 'Available', 'Outlet': 'OutletB'}, {'PlateN': 'SE001C', 'Make': 'Kia', 'Model': 'Cerato', 'Category': 'Sedan', 'Status': 'Available', 'Outlet': 'OutletC'}]

投稿2022/10/22 08:54

meg_

総合スコア9769

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

0

下は質問記載のコードの一部をそのまま引用したものです。
なお、質問に記載されている縛りとして「インポートするモジュールは、datetime のみ」とのこと。

python

1 for d in carlist: 2 if carlist[d]['Category'] == requestcategory and carlist[d]['Status'] == 'Available': 3 for l in customerlist: 4 reservedpickup_str = datetime.strptime(customerlist[l]['Pickupdatetime'] ,'%Y/%m/%d %H:%M:%S') 5 reservedreturn_str = datetime.strptime(customerlist[l]['Returndatetime'] ,'%Y/%m/%d %H:%M:%S') 6 7 if carlist[d]['PlateN'] == customerlist[l]['PlateN'] and reservedpickup_str < request_pickuptime and request_returntime < reservedreturn_str: 8 pass 9 elif carlist[d]['PlateN'] == customerlist[l]['PlateN'] and request_pickuptime < reservedpickup_str and reservedpickup_str < request_returntime and request_returntime < reservedreturn_str : 10 pass 11 elif carlist[d]['PlateN'] == customerlist[l]['PlateN'] and reservedpickup_str < request_pickuptime and request_pickuptime < reservedreturn_str and reservedreturn_str < request_returntime: 12 pass 13 else: 14 sorted_carlist = carlist[d] 15 else: 16 pass

1.条件判定の考え方

上記の部分では、for d in carlist:で車を1台ずつ取り出し、その車について
for l in customerlist:で予約を1件ずつ取り出し、
その予約1件について、carlist内の該当するプレートナンバーの車について、下記の条件にすべて当てはまらない場合、その車をsorted_carlist に加えています。

言い換えると、上記のコードでは、carlist から1件ずつ取り出した車について、予約済み案件を1件ずつ参照し「その予約済み案件の車のナンバープレートが、着目している車のナンバープレートと等しく」かつ「列挙した条件をすべて満たさなかった場合」 sorted_list に入れています。

しかしながら、同時に「着目している車と、取り出した予約済み案件の対象となる車が等しくない場合」には有無をいわさずsorted_list に入れてしまっていることに注意が必要です。

「その予約済み案件が、着目している車に関するものではない場合」であっても、他の予約済み案件ではその車の利用期間が、リクエストした予約と重なっている可能性があります。

また、customerlist (予約一覧)から取り出した予約済み案件1件についてだけ時間を比較し、結果重複条件に当てはまらなければすぐに sorted_list に加えるようにしてしまっている点も問題です。

予約一覧から取り出したある予約済み案件が、着目している車に関するものであって、かつその案件がリクエスト予約時間と重複しない場合であっても、他の予約済み案件では、当該車の利用期間がリクエストした予約と重なっている可能性があります。

例:

たとえば、customerlist(予約済み一覧)が下記の2件であるとします。

text

1<予約状況> 21 SE001A Bob 10月03日09時~10月05日09時 32 SE001A Jack 10月05日12時~10月06日12時

リクエストする予約時間は、コードの通り 10月4日9時~10月5日9時とします。

元のコードでは、ループの最初で、リクエストした予約時間が1件目のBobの予約と重複するのでいったん除外されますが、
次のループで2件目(Jackの予約)と比較するタイミングで、Jackの予約時間とリクエスト予約時間とは重複しないため、sorted_list に加えられてしまいます。

正しくは 「着目している車1台に割り当てられているすべての予約についてリクエストした条件と重複するか調べ、すべて重複しない場合(その車に対して予約がゼロの場合含む)」に初めて sorted_list に加える という考え方になります。
(もちろん前提として当該車のStatusはAvailableでなければなりません)

2.不足している条件

重複判定条件も不足しています。
わかりやすいように、変数名を下記のように読みかえます。

  • request_pickuptime = 希望ピックアップ日時
  • request_returntime = 希望返却日時
  • reservedpickup_str = 予約済ピックアップ日時
  • reservedreturn_str = 予約済返却日時

元のコードに書いてある条件=下記にすべて当てはまらない場合、重複しないとみなし、当該車をsorted_listに加える。逆に言えば、下記のいずれかに当てはまる場合は、重複するとみなし、次のループに移る>

①予約済ピックアップ日時 < 希望ピックアップ日時
かつ 希望返却日時 < 予約済返却日時  (=予約期間が希望期間を全部内包)

②希望ピックアップ日時 < 予約済ピックアップ日時
かつ 予約済ピックアップ日時 < 希望返却日時
かつ 希望返却日時 < 予約済返却日時 (=希望返却日時が予約済ピックアップ日をまたぐ)

③予約済ピックアップ日時 < 希望ピックアップ日時
かつ 希望ピックアップ日時 < 予約済返却日時
かつ 予約済返却日時 < 希望返却日時 (=予約済返却日が希望ピックアップ日時をまたぐ)

しかし上記で除外しきれていない条件があります。
それは「希望期間が、予約済期間を内包する場合」です。
すなわち下記を④として条件に加える必要があります。

④ 希望ピックアップ日時 ≦ 予約済ピックアップ日時
かつ 予約済返却日時 ≦ 希望返却日時  (=希望期間が予約済期間を全部内包)

また、希望日時に対して予約済日時が重複する部分の開始/終了境界は等号つきの条件であるべきなので、これも考慮する必要があります。

たとえば

  • SE001A を 10月3日9時00分00秒~10月5日9時00分00秒までBobが利用予定

という予約が1件だけ入っていると仮定します。
これに対して、10月3日9時00分00秒~10月4日9時00分00秒までの予約をリクエストした場合、

①予約済ピックアップ日時 < 希望ピックアップ日時
かつ 希望返却日時 < 予約済返却日時  (=予約期間が希望期間を全部内包)

だと、希望ピックアップ日時と、予約済ピックアップ日時が等しいため、①の条件にあてはまらず、予約可能、ということになってしまいます。
したがって一般的に考えられる意図通りに動かすならば、

①予約済ピックアップ日時 ≦ 希望ピックアップ日時
かつ 希望返却日時 ≦ 予約済返却日時  (=予約期間が希望期間を全部内包)

とすべきです。
②~③も同様に修正する必要があります。

3.条件を簡単にする

実は(すべてのデータについて「ピックアップタイム<返却時間」となっており、かつデータに不整合がない限り)
「上記①~④のいずれかにあてはまる」という条件は、
下記のようにまとめて1行にできます。(※等号付き不等号については修正済みとする)

「(予約済返却時間 < 希望ピックアップタイム) または (希望返却時間 < 予約済ピックアップタイム)」ではない
(コメントで「001B」が除外されていることから、ピックアップと返却が同時になる場合は重複と見なしていると判断)

4.その他

python

1 sorted_carlist = carlist[d]

これだと最後の抽出された車情報しか格納されません。

python

1 sorted_carlist.append(carlist[d])

等とするべきでしょう。

python

1 return sorted_carlist['PlateN']

sorted_carlist はリストとして初期化されているので、辞書のようにアクセスできません。
ここは

python

1 return sorted_carlist

とします。


修正案

上記を参考に元のコードを書き換えたのが下記です。
(変更がなるべく最小限になるように書き換えています)

python

1# 質問に記載されている縛り「インポートするモジュールは、datetime のみ」 2from datetime import datetime 3 4#入力値 5requestcategory = 'Sedan' 6pickdatetime = '2022/10/4 9:00' 7returndatetime = '2022/10/5 9:00' 8request_pickuptime = datetime.strptime(pickdatetime,'%Y/%m/%d %H:%M') 9request_returntime = datetime.strptime(returndatetime,'%Y/%m/%d %H:%M') 10 11def sort_availablecar(): 12 13 with open("carlist.txt", "r") as file: 14 carlist = eval(file.read()) 15 16 with open("customerlist.txt", "r") as file: 17 customerlist = eval(file.read()) 18 19 sorted_carlist = [] 20 for d in carlist: 21 if carlist[d]['Category'] == requestcategory and carlist[d]['Status'] == 'Available': 22 for l in customerlist: 23 reservedpickup_str = datetime.strptime(customerlist[l]['Pickupdatetime'] ,'%Y/%m/%d %H:%M:%S') 24 reservedreturn_str = datetime.strptime(customerlist[l]['Returndatetime'] ,'%Y/%m/%d %H:%M:%S') 25 if carlist[d]['PlateN'] != customerlist[l]['PlateN']: 26 continue 27 if not (reservedreturn_str < request_pickuptime or request_returntime < reservedpickup_str): 28 # 重複する予約が存在する場合 29 break 30 else: 31 # どの予約とも重複しない場合 32 sorted_carlist.append(carlist[d]) 33 34 return sorted_carlist 35 36available_cars = sort_availablecar() 37if available_cars == []: 38 print("There is no car available for your requested time.") 39else: 40 print("There is Available car for your request!") 41 for car in available_cars: 42 print(car)

あまりなじみがないかもしれませんが、「すべての条件をパスした場合」という制御のために、python の for ... else ...文を使っています。

投稿2022/10/22 05:56

編集2022/10/23 08:15
qnoir

総合スコア7910

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.02%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。