0

私は 2 つのリストを持っています。2 番目のリストは、件名のレポートが必要かどうかについての情報を提供するレポート リストです。

レポート リストの可能な値は次のとおりです。

  • All_Subjects は、すべての被験者のレポートが必要であることを意味します。
  • No_Subject は、どの件名についてもレポートを必要としないことを意味します
  • 最後に、SubjectName_(All|NO)_Report という形式で、特定の件名についてレポートが必要かどうかを意味します。-subject_list = ["Subject", "Chemistry", "Physics" , "Mathematics" , "Bio"] #sequence は常に同じままです。
  • Reporting_list は ["All_Subjects", "No_Subjects", "Chemistry_No_Report","Chemistry_All_Report"] にすることができます #シーケンスは関係ありません

関数 report_required は、レポートが必要かどうかのリストを返し、リストを返します。リストの値がすべて「なし」の場合は、レポートが不要であることを意味します。

例:私は持っています:

reporting_list = ["Chemistry_No_Report", "Mathematics_All_Report] 
subject_list   = ["Subject", "Chemistry", "Physics" , "Mathematics"] 

私の subject_list は常に値 Subject で始まります。これは、マップされた値を返すときに無視し
、戻り値は["No", None, "Yes"]

以下の私の現在の機能は機能します.2つのリスト値に基づいて3番目のリストをマッピングするより効率的な方法はありますか.

def reportRequired( reporting_list , subject_list):

    report_list = [None]*4


    for value in reporting_list:
                # subject_list starts with a header value "Subject", thats why iterating from index 1
                if value.startswith("All"):
                   for idx in range(1, len(subject_list)):
                        report_list[idx-1] = "Yes"

                if value.startswith("No"):
                    for idx in range(1, len(subject_list)):
                        report_list[idx-1] = "No"


                if value.split("_")[1].lower() == "no":
                    for idx in range(1, len(subject_list)):
                        if value.split("_")[0].strip() == subject_list[idx]:
                            report_list[idx-1] = "No"

                if value.split("_")[1].lower() == "all":
                    for idx in range(1, len(subject_list)):
                        if value.split("_")[0].strip() == subject_list[idx]:
                            report_list[idx-1] = "Yes"
      return report_list
4

1 に答える 1

0

サブジェクト名をインデックスにマップするディクショナリを作成し、それを使用して report_list の要素にアクセスします。このようにして、3 番目と 4 番目のケースの 2 次複雑さを回避します。

1 番目と 2 番目のケースの場合: Yes-es で満たされたリストと No-s で満たされたリストを準備します。その後、そのケースがreporting_listに表示される頻度に関係なく、それらを使用できます。注: report_list の初期化で既に行っているように、['Yes']*4 を使用できます。

全体的な複雑さは「ほぼ」線形です(O(1)辞書アクセスを想定しています...)

編集: 件名が件名リストに複数回表示される場合、これは機能しません。ただし、すべての科目の回答を格納する辞書を作成し、第 2 段階で科目リストを調べて、すべての科目の回答を出力することができます。

于 2013-03-20T19:59:23.937 に答える